上一篇寫了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();

數(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é)果如下:

總耗時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é)果如下:

開啟事務(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ù)