Android資料庫升級例項
Andoird的SQLiteOpenHelper類中有一個onUpgrade方法。幫助文件中只是說當資料庫升級時該方法被觸發。經過實踐,解決了我一連串的疑問:
1. 幫助文件裡說的“資料庫升級”是指什麼?
你開發了一個程式,當前是1.0版本。該程式用到了資料庫。到1.1版本時,你在資料庫的某個表中增加了一個欄位。那麼軟體1.0版本用的資料庫在軟體1.1版本就要被升級了。
2. 資料庫升級應該注意什麼?
軟體的1.0版本升級到1.1版本時,老的資料不能丟。那麼在1.1版本的程式中就要有地方能夠檢測出來新的軟體版本與老的資料庫不相容,並且能夠有辦法 把1.0軟體的資料庫升級到1.1軟體能夠使用的資料庫。換句話說,要在1.0軟體的資料庫的那個表中增加那個欄位,並賦予這個欄位預設值。
3. 程式如何知道資料庫需要升級?
SQLiteOpenHelper類的建構函式有一個引數是int version,它的意思就是指資料庫版本號。比如在軟體1.0版本中,我們使用SQLiteOpenHelper訪問資料庫時,該引數為1,那麼資料庫版本號1就會寫在我們的資料庫中。
到了1.1版本,我們的資料庫需要發生變化,那麼我們1.1版本的程式中就要使用一個大於1的整數來構造SQLiteOpenHelper類,用於訪問新的資料庫,比如2。
當我們的1.1新程式讀取1.0版本的老資料庫時,就發現老資料庫裡儲存的資料庫版本是1,而我們新程式訪問它時填的版本號為2,系統就知道資料庫需要升級。
4. 何時觸發資料庫升級?如何升級?
當系統在構造SQLiteOpenHelper類的物件時,如果發現版本號不一樣,就會自動呼叫onUpgrade函式,讓你在這裡對資料庫進行升級。根據上述場景,在這個函式中把老版本資料庫的相應表中增加欄位,並給每條記錄增加預設值即可。
新版本號和老版本號都會作為onUpgrade函式的引數傳進來,便於開發者知道資料庫應該從哪個版本升級到哪個版本。
升級完成後,資料庫會自動儲存最新的版本號為當前資料庫版本號。
參考:StackOverFlow對“資料庫版本在資料庫中的儲存位置”的問答。
第二部分做Android應用,不可避免的會與SQLite打交道。隨著應用的不斷升級,原有的資料庫結構可能已經不再適應新的功能,這時候,就需要對 SQLite資料庫的結構進行升級了。
並且只能在表的末尾新增欄位,比如,為 Subscription新增兩個欄位:
1 ALTER TABLE Subscription ADD COLUMN Activation BLOB;
2 ALTER TABLE Subscription ADD COLUMN Key BLOB;
另外,如果遇到複雜的修改操作,比如在修改的同時,需要進行資料的轉移,那麼可以採取在一個事務中執行如下語句來實現修改表的需求。
1. 將表名改為臨時表
ALTER TABLE Subscription RENAME TO __temp__Subscription;
2. 建立新表
CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);
3. 匯入資料
INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM __temp__Subscription;
或者
INSERT INTO Subscription() SELECT OrderId, “”, ProductId FROM __temp__Subscription;
* 注意 雙引號”” 是用來補充原來不存在的資料的
4. 刪除臨時表
DROP TABLE __temp__Subscription;
通過以上四個步驟,就可以完成舊資料庫結構向新資料庫結構的遷移,並且其中還可以保證資料不會應為升級而流失。
當然,如果遇到減少欄位的情況,也可以通過建立臨時表的方式來實現。