1.使用的工具
國(guó)外程序員網(wǎng)站stackoverflow上面提供的MigrationHelper.java類(lèi)做數(shù)據(jù)庫(kù)升級(jí)。
說(shuō)明:該類(lèi)有點(diǎn)小bug,后面會(huì)介紹解決方案。
2.原理說(shuō)明
1.應(yīng)用程序啟動(dòng)的時(shí)候,根據(jù)需要升級(jí)的表創(chuàng)建新的臨時(shí)表
2.將需要更新表的數(shù)據(jù)遷移到臨時(shí)表中
3.刪除更新前的表,重命名臨時(shí)表
3.數(shù)據(jù)庫(kù)升級(jí)(以下內(nèi)容需要結(jié)合第一篇文章,greenDAO的使用詳解---(1)greenDAO的配置和增刪改查)
-
由于升級(jí)數(shù)據(jù)庫(kù)需要在DevOpenHelper類(lèi)的onUpgrade()方法里面繼續(xù),因此我們需要自定義一個(gè)類(lèi)繼承DevOpenHelper重寫(xiě)onUpgrade()方法
image
注意:在onUpgrade()方法中可以不調(diào)用父類(lèi)的onUpgrade()方法,因?yàn)樽鰯?shù)據(jù)庫(kù)升級(jí)的時(shí)候已經(jīng)在MigrationHelper中調(diào)用了父類(lèi)的onUpgrade()方法中的內(nèi)容
-
在初始化數(shù)據(jù)庫(kù)的時(shí)候用自定義的MyDevOpenHelper類(lèi)替換原來(lái)的DevOpenHelper類(lèi)
image -
修改在項(xiàng)目根目錄build.gradle文件中配置的數(shù)據(jù)庫(kù)版本號(hào)(新版本號(hào)一定要比老版本大)
image -
在onUpgrade()方法調(diào)用數(shù)據(jù)庫(kù)升級(jí)方法
image
migrate()方法說(shuō)明:在我們保存數(shù)據(jù)庫(kù)的bean對(duì)象中,有多少個(gè)bean對(duì)象的屬性字段發(fā)生改變,我們就在改方法中傳入改變的bean的Class
-
升級(jí)測(cè)試-在第一篇文章中創(chuàng)建的User類(lèi)中新增加一個(gè)屬性字段,測(cè)試數(shù)據(jù)保存情況。
image - 其他相關(guān)說(shuō)明
如果我們沒(méi)有在onUpgrade()方法中調(diào)用數(shù)據(jù)庫(kù)升級(jí)方法,而是直接調(diào)用父類(lèi)onUpgrade()方法,用戶(hù)安裝我們的新版本應(yīng)用時(shí)候,原來(lái)保存在數(shù)據(jù)庫(kù)中的數(shù)據(jù)都沒(méi)有,相當(dāng)于我們刪掉了原來(lái)的數(shù)據(jù)庫(kù),創(chuàng)建一個(gè)新數(shù)據(jù)庫(kù)。
4.遺留問(wèn)題(解決方案,請(qǐng)查看下一篇文章)
-
當(dāng)我們測(cè)試升級(jí)的是,在User中增加一個(gè)int屬性測(cè)試時(shí)。就會(huì)以下錯(cuò)誤:
image





