Android數據庫升級總結

1、數據庫升級概念

在開發應用時,我們經常會用數據庫來保存數據。 但是隨着應用的版本不斷升級, 之前的數據庫結構可能不太適應當前版本, 這時就需要升級數據庫, 使之符合當前需求。類似應用升級, 數據庫的升級也需要version來標明。 不同的是應用版本的升級, 只需更改AndroidManifest.xml文件中的versionCode與versionName即可。 但是數據庫的升級需要在代碼裏面修改。

2、數據庫升級原理

2.1、升級原理分析

在使用數據庫時, 我們會定義一個擴展了抽象類SQLiteOpenHelper的子類。例如,

圖1

圖1 DatabaseHelper

其中, 構造函數調用了父類即SQLiteOpenHelper的構造方法, 其中包含了一個version的參數。這個參數即是數據庫的版本。 所以,我們可以通過修改version來實現數據庫的升級。 一般的,在數據庫初始開發時設置爲1,然後每次升級時遞增。
其次,在SQLiteOpenHelper中還定義了兩個抽象的方法,onCreate( )、onUpgrade( )。
這兩個方法顧名知義對應着數據庫的創建和升級兩個過程。我們一般在onCreate( )方法中進行創建表等操作,在onUpgrade( )方法中進行修改表等操作。 例如,

圖2

圖2 實現的方法

當在某個應用1.0版時, 設置構造方法中的參數version爲1。我們在使用SQLiteOpenHelper訪問數據庫時,系統會讀取該參數。如果該參數爲0,表示之前沒有數據庫文件, 則將version爲1寫入數據庫,並調用onCreate( )方法創建數據庫。當需要升級數據庫時將version設置爲2。在應用訪問數據庫時就會去讀取數據庫中存儲的數據庫版本,如果發現不一樣(變大), 則會調用onUpgrade( )方法,觸發升級邏輯。

2.2、具體代碼分析

2.2.1、SQLiteOpenHelper類構造方法

圖3

圖3 SQLiteOpenHelper構造方法

其中, CursorFactory和DatabaseErrorHandler一般是傳null。 我們可以看到,構造SQLiteOpenHelper對象時如果數據庫版本號低於1是會報異常的。

2.2.2、SQLiteOpenHelper的使用

在訪問數據庫時,我們一般會new一個SQLiteHelper的對象。

圖4

圖4 SQLiteOpenHelper的使用

其中,getWritableDatabase( )會調用getDatabaseLocked(false)方法,在該方法中實現了對數據庫版本檢查和升級等的邏輯。其中部分代碼如下,

圖5

圖5 數據庫升級邏輯

我們可以看到,系統會先調用getVersion( )獲取當前數據庫版本。如果沒有數據庫文件存在,則getVersion( )方法會返回0. 從而調用onCreate( )方法。如果version不爲0,則會比較當前version與數據庫中保存的version值從而決定是升級還是降級。對於降級系統會拋出異常,如下

圖6

圖6 降級邏輯

而升級的操作,則需要我們在子類中實現。最後,系統會將當前數據庫版本version值保存到數據庫中。

3、數據庫升級注意事項

在升級數據庫時,如果我們需要在原有表的基礎上增加一個字段,那麼需要注意的是,一定要爲老數據的的新添字段設置默認值。否則,在查詢該數據表時會返回空。增加列並設置默認值的方法如下:

圖7

圖7 增加字段並設置默認值

其次,數據庫的升級是對於升級用戶的而言的。但是對於新用戶系統會新創建數據庫,所以在增加字段的同時也要在onCreate( )方法中修改創建該表的SQL語句,從而增加字段。這樣那麼不管是升級用戶還是新用戶,數據庫中的該表都增加了該字段。

4、結論

1.數據庫的升級是通過修改version值實現的。
2.新用戶會通過onCreate()方法產生數據庫。對於升級用戶而言,如果沒有升級數據庫,則不會進行數據庫創建及升級操作。如果升級了數據庫,則會調用onUpgrade( )方法。
3.應用的升級與數據庫升級無必然的聯繫。

5、參考

  1. 網址:http://blog.csdn.net/jiangwei0910410003/article/details/39670813
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章