關於Android數據庫版本升級的一點資料

在網上找了大把大把的資料、還是沒能怎麼弄清楚關於SQLite升級。固把一些網上找到的資料跟自己摸索出來的東西一起發出來。望有厲害的前輩能夠指點一二。


      先上網上一些高手的資料:http://blog.sina.com.cn/s/blog_6400e5c50101mgu4.html   、http://blog.csdn.net/yaya_soft/article/details/17089353 、 http://www.iteye.com/topic/1127838。


其中我所在的情況跟第三位前輩所遇到的情況一樣, 先說Android SQLite吧, Android系統本身自帶了一個建立SQLite的工具SQLiteOpenHelper、我們只要繼承它,裏面有幾個重寫的方法。



  爲了方便快捷、我只列出了onCreate方法跟onUpgrade方法。  onCreate方法是我們第一次創建數據庫的時候會調用,onUpgrade()是我們數據庫版本號不一樣的時候會調用。網上很多資料都說如果要進行數據庫升級,那就直接在onUpgrade裏面寫你所需要的進行的操作。比如:



至於裏面代碼具體的作用可以參照上面第一 第二個鏈接,裏面有詳細解釋。  

 本人的情況是:本人使用外帶的可視化工具直接把數據庫跟表都已經建立好了,直接複製在raw目錄下面。就沒有通過系統自帶的方法來建立數據庫跟表。於是網上找資料一直不明白他們所謂的 在onUpgrade裏面進行升級。 因爲本人代碼壓根就沒onUpgrade方法可以使用。  完了在網上找到各種資料、最終明白:無論你是用系統自帶的SQLiteOpenHelper工具建立數據庫跟表、還是使用外帶工具。如果你要進行數據庫升級。你所需要的操作都是一樣的。只是系統自帶的裏面有onUpgrade()方法直接調用。而用外帶工具的話你肯定也有一個自己寫的SQLite操作類、只是使用自己寫的操作類的話、onUpgrade()方法也是我們自己寫。  反正裏面要進行的操作都是一樣的。

現在就看看如何進行數據庫升級。



關於這塊代碼、如果你使用自己寫的SQLite操作類,那你一看就明白。我們只需要得到db對象。就可以使用 db.execSQL("ALTER TABLE Subscription ADD COLUMN Activation BLOB");   這個和SQLiteOpenHelper裏面onUpgrade()方法裏面的操作是一樣的;同樣是升級數據庫的操作。

 接下來就說說怎麼判斷數據庫需要升級、這個就是涉及到版本匹配了、



再看這塊代碼、我們只要拿到db對象、就可以拿到db對應的版本、同時也可以更新db 的版本。完了我們可以參照上面鏈接中第三位前輩的方法、把我們最新的數據庫版本定義在versionCode在AndroidManifest.xml文件中。  這樣你最新數據庫版本跟以前數據庫版本都有了 、就可以判斷更新不更新。這裏解釋下關於外帶數據庫的一些事情: 外帶數據即我們通過sqlite expert professional可視化 工具建立一個sqlite.db文件、同時把文件放在raw目錄下、我們每次進行數據庫操作的時候就會先把raw目錄下的sqlite.db複製到手機裏面的路徑下(如果手機路徑裏面存在sqlite.db就不復制)、完了以後每次取數據庫都是從手機路徑裏面取的。如果我們raw目錄下的sqlite.db進行了更新(我們自己把數據表改下、直接替換 ).同時我們的apk版本進行升級更新的時候覆蓋安裝apk。我們手機目錄下的sqlite.db是不會更新的,還是舊版本。 但是我們raw目錄下的sqlite.db是新版本。這個時候也不會再複製到手機。 這就需要我們把手機目錄下的sqlite.db替換成raw目錄下的。    寫到這裏我又想起一個事情:以前有位同事問爲什麼要把raw目錄下的sqlite.db複製到手機、然後又操作手機路徑下的sqlite.db 這不是多此一舉嗎。他說可以把sqlite.db放在assets目錄下、不復制到手機路徑。直接就是操作assets目錄下的sqlite.db,這樣每次數據庫更新就直接替換assets目錄下的sqlite.db。    我不知道放在assets目錄下的好處、同時也不知道放在raw 然後複製到手機路徑的好處。  這些我都不知道(望高人指點), 我只知道反正就是不能直接替換salite.db , 直接替換的話就是把舊版本的sqlite.db刪除、再安裝新版本的sqlite.db。

如果這樣操作的話好像以前的數據都會丟失、就好像卸載重裝一樣。 無論何種方式我們要想保留數據都要進行數據的轉移。關於數據轉移前面給的鏈接中有。這裏就不多討論了。  發這篇文章只是自己搞這塊的時候,一直被網上說的在onUpgrade()方法中直接更新搞糊塗了。 在這裏記下來、免得下次不記得。        

嗯 就這樣子吧、 第一次寫文章 、寫得不好、主要是爲了自己記一下。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章