部落格分類:
android
之前一直不知道這個東西是幹什麼的,資料庫的版本号也是随便定義的,還有兩個版本号。
Android在設計時,就考慮到了資料庫的更新。當檢測到版本有變化時,就會對資料庫更新,執行這個操作。
是以定義資料庫的版本還是比較重要的,如第一個程式版本時定義的資料庫版本為1,在程式釋出新版時有對資料庫更新操作,可能增加表,增加列,如果沒有調整這個版本,資料庫不會建立新的表,也不會添加新的列,安裝新版的程式就會崩潰了。
查了一些資料終于明白了。
ContactsDatabaseHelper這個是系統 聯系人的源碼中的一個類,裡面已經定義了版本為353,
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}在這個方法裡處理了更新
大概代碼是這樣的
Java代碼
1. if (oldVersion < 99) {直接删除所有的表,重建,有可能是變化太大的問題吧。}
2.
3. if (oldVersion == 100) {
4. CREATE INDEX建立一個新的索引
5. oldVersion++;增加舊版本号,
6. }
7. 。。。之後多個操作,依次增加版本号。
8.
9. if (oldVersion == 105) {
10. upgradeToVersion202(db);//直接增加到202
11. oldVersion = 202;
12. }
13.
14. 對于資料庫的版本号還要嚴格地處理。
15. 這裡 對oldVersion操作完成後需要與newVersion一樣,才算更新成功。
16. if (oldVersion != newVersion) {
17. throw new IllegalStateException(
18. "error upgrading the database to version " + newVersion);
19. } //當然這不是強制要求的,
20. upgrade就結束了。
21. 這樣資料庫版本号就是newVersion,如果下一次要更新,就至少要比這個高才會觸發。
也許有人會問,如果目前的表的存了資料,程式又不願重新安裝,更新資料庫時要保留原來的資料怎麼辦呢?
以上的版本更新是必然要做的事,但是沒有提到資料更新的問題。
如果不是删除原來的表格,隻是增加了一列,可能會要求對這列賦預設的值
1. 上面有一個跨度較大的就是100多到202的更新:
2. upgradeToVersion202(SQLiteDatabase db)看這個方法:
3. db.execSQL(
4. "ALTER TABLE " + Tables.PHONE_LOOKUP +
5. " ADD " + PhoneLookupColumns.MIN_MATCH + " TEXT;");
6. 增加了一列。
7.
8. SQLiteStatement update = db.compileStatement(
9. "UPDATE " + Tables.PHONE_LOOKUP +
10. " SET " + PhoneLookupColumns.MIN_MATCH + "=?" +
11. " WHERE " + PhoneLookupColumns.DATA_ID + "=?");
12. 建立更新語句。
14. Cursor c = db.query(Tables.PHONE_LOOKUP + " JOIN " + Tables.DATA +
15. " ON (" + PhoneLookupColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")",
16. new String[]{Data._ID, Phone.NUMBER}, null, null, null, null, null);
17. 處理新的列。
18.
19. 更新資料。
20. try {
21. while (c.moveToNext()) {
22. long dataId = c.getLong(0);
23. String number = c.getString(1);
24. if (!TextUtils.isEmpty(number)) {
25. update.bindString(1, PhoneNumberUtils.toCallerIDMinMatch(number));
26. update.bindLong(2, dataId);
27. update.execute();
28. }
29. }
30. } finally {
31. c.close();
32. }
33. 這就是處理資料更新的過程。