android SQLite (二)升級和優(yōu)化

上一篇寫了android sqlite的基本操作,現(xiàn)在來記錄下數(shù)據(jù)庫的升級和優(yōu)化;
隨著app版本的更新,數(shù)據(jù)可能發(fā)生變化,所以數(shù)據(jù)庫也需要更新,android的數(shù)據(jù)庫更新是根據(jù)數(shù)據(jù)庫的版本號來判斷是否需要升級的。

數(shù)據(jù)庫的升級

上一篇文章在繼承SQLiteOpenHelp類中重寫了兩個方法,一個是OnCreate(),另一個是onUpgrade(),第一個是用來創(chuàng)建數(shù)據(jù)庫用的,第二個是用來更新數(shù)據(jù)庫的,比如添加字段和添加表等。
只要在將數(shù)據(jù)庫的版本改成比之前大的數(shù)字就會調(diào)用onUpgrade();

onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion)

onUpgrade方法里 有三個參數(shù),看參數(shù)名就知道了,就不說了。
下面我們要給students表增加一個地址字段,addr;

@Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        switch (oldVersion){
            case 1:
                sqLiteDatabase.execSQL("alter table Students add column addr text");
                break;
        }
    }

執(zhí)行這個方法的前提是修改數(shù)據(jù)庫版本

  mySQLiteHelp = new MySQLiteHelp(this,MySQLiteHelp.DB_NAME,null,MySQLiteHelp.VERSION);// 第四個參數(shù)  在這里是傳了2

再執(zhí)行創(chuàng)建數(shù)據(jù)庫的方法

   mySQLiteHelp.getWritableDatabase();
image.png

數(shù)據(jù)庫的優(yōu)化

使用事務(wù)

使用事務(wù)的兩大好處是原子提交和更優(yōu)性能。

(1) 原子提交

原則提交意味著同一事務(wù)內(nèi)的所有修改要么都完成要么都不做,如果某個修改失敗,會自動回滾使得所有修改不生效。

(2) 更優(yōu)性能

Sqlite默認(rèn)會為每個插入、更新操作創(chuàng)建一個事務(wù),并且在每次插入、更新后立即提交。
這樣如果連續(xù)插入100次數(shù)據(jù)實際是創(chuàng)建事務(wù)->執(zhí)行語句->提交這個過程被重復(fù)執(zhí)行了100次。如果我們顯示的創(chuàng)建事務(wù)->執(zhí)行100條語句->提交會使得這個創(chuàng)建事務(wù)和提交這個過程只做一次,通過這種一次性事務(wù)可以使得性能大幅提升。尤其當(dāng)數(shù)據(jù)庫位于sd卡時,時間上能節(jié)省兩個數(shù)量級左右。

現(xiàn)在來寫一個例子,往數(shù)據(jù)庫中加入100條數(shù)據(jù)
正常情況
 long startTime = System.currentTimeMillis();
                for (int i = 0;i<100;i++){
                    ContentValues values = new ContentValues();
                    values.put("name","小紅"+i);
                    values.put("class","一年級"+i);
                    values.put("year",7);
                    values.put("grade",100);
                    values.put("addr","中國廣州"+i);
                    db.insert("Students",null,values);
                }
                long endTime = System.currentTimeMillis();
                String message = "總共耗時" + (endTime - startTime);
                Log.d(TAG, message);

結(jié)果如下:

image.png

總耗時253

開啟事務(wù)
long startTime = System.currentTimeMillis();
                db.beginTransaction();
                try {
                    for (int i = 0;i<100;i++){
                        ContentValues values = new ContentValues();
                        values.put("name","小紅"+i);
                        values.put("class","一年級"+i);
                        values.put("year",7);
                        values.put("grade",100);
                        values.put("addr","中國廣州"+i);
                        db.insert("Students",null,values);
                    }
                     db.setTransactionSuccessful();
                 }finally {
                    db.endTransaction();
                 }
                long endTime = System.currentTimeMillis();
                String message = "總共耗時" + (endTime - startTime);
                Log.d(TAG, message);

結(jié)果如下:

image.png

開啟事務(wù)之后只用了30
是不是更快了些。

//開啟一個事務(wù)
 db.beginTransaction();
//設(shè)置事務(wù)標(biāo)志為成功,當(dāng)結(jié)束事務(wù)時就會提交事務(wù)
 db.setTransactionSuccessful();
//結(jié)束事務(wù)
 db.endTransaction();

需要注意的一點是 不要忘記調(diào)用endTransaction來結(jié)束事務(wù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容