Android資料庫升級總結
1、資料庫升級概念
在開發應用時,我們經常會用資料庫來儲存資料。 但是隨著應用的版本不斷升級, 之前的資料庫結構可能不太適應當前版本, 這時就需要升級資料庫, 使之符合當前需求。類似應用升級, 資料庫的升級也需要version來標明。 不同的是應用版本的升級, 只需更改AndroidManifest.xml檔案中的versionCode與versionName即可。 但是資料庫的升級需要在程式碼裡面修改。
2、資料庫升級原理
2.1、升級原理分析
在使用資料庫時, 我們會定義一個擴充套件了抽象類SQLiteOpenHelper的子類。例如,
其中, 建構函式呼叫了父類即SQLiteOpenHelper的構造方法, 其中包含了一個version的引數。這個引數即是資料庫的版本。 所以,我們可以通過修改version來實現資料庫的升級。 一般的,在資料庫初始開發時設定為1,然後每次升級時遞增。
其次,在SQLiteOpenHelper中還定義了兩個抽象的方法,onCreate( )、onUpgrade( )。
這兩個方法顧名知義對應著資料庫的建立和升級兩個過程。我們一般在onCreate( )方法中進行建立表等操作,在onUpgrade( )方法中進行修改表等操作。 例如,
當在某個應用1.0版時, 設定構造方法中的引數version為1。我們在使用SQLiteOpenHelper訪問資料庫時,系統會讀取該引數。如果該引數為0,表示之前沒有資料庫檔案, 則將version為1寫入資料庫,並呼叫onCreate( )方法建立資料庫。當需要升級資料庫時將version設定為2。在應用訪問資料庫時就會去讀取資料庫中儲存的資料庫版本,如果發現不一樣(變大), 則會呼叫onUpgrade( )方法,觸發升級邏輯。
2.2、具體程式碼分析
2.2.1、SQLiteOpenHelper類構造方法
其中, CursorFactory和DatabaseErrorHandler一般是傳null。 我們可以看到,構造SQLiteOpenHelper物件時如果資料庫版本號低於1是會報異常的。
2.2.2、SQLiteOpenHelper的使用
在訪問資料庫時,我們一般會new一個SQLiteHelper的物件。
其中,getWritableDatabase( )會呼叫getDatabaseLocked(false)方法,在該方法中實現了對資料庫版本檢查和升級等的邏輯。其中部分程式碼如下,
我們可以看到,系統會先呼叫getVersion( )獲取當前資料庫版本。如果沒有資料庫檔案存在,則getVersion( )方法會返回0. 從而呼叫onCreate( )方法。如果version不為0,則會比較當前version與資料庫中儲存的version值從而決定是升級還是降級。對於降級系統會丟擲異常,如下
而升級的操作,則需要我們在子類中實現。最後,系統會將當前資料庫版本version值儲存到資料庫中。
3、資料庫升級注意事項
在升級資料庫時,如果我們需要在原有表的基礎上增加一個欄位,那麼需要注意的是,一定要為老資料的的新添欄位設定預設值。否則,在查詢該資料表時會返回空。增加列並設定預設值的方法如下:
其次,資料庫的升級是對於升級使用者的而言的。但是對於新使用者系統會新建立資料庫,所以在增加欄位的同時也要在onCreate( )方法中修改建立該表的SQL語句,從而增加欄位。這樣那麼不管是升級使用者還是新使用者,資料庫中的該表都增加了該欄位。
4、結論
1.資料庫的升級是通過修改version值實現的。
2.新使用者會通過onCreate()方法產生資料庫。對於升級使用者而言,如果沒有升級資料庫,則不會進行資料庫建立及升級操作。如果升級了資料庫,則會呼叫onUpgrade( )方法。
3.應用的升級與資料庫升級無必然的聯絡。