天天看點

Android資料庫更新onupgrade

部落格分類: 

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. 這就是處理資料更新的過程。