GreenDao 解決數(shù)據(jù)庫升級(jí)

IP地址:http://blog.csdn.net/ljy_programmer/article/details/78257528?locationNum=10&fps=1

github 源碼地址:GreenDaoUpgradeHelper/MySQLiteOpenHelper.java at master · yuweiguocn/GreenDaoUpgradeHelper · GitHub

學(xué)習(xí)/參考地址:?

http://www.lxweimin.com/p/4e6d72e7f57a?

http://blog.csdn.net/qq_30379689/article/details/54410838?

http://blog.csdn.net/shineflowers/article/details/53405644

前言

在以前選擇數(shù)據(jù)庫框架的時(shí)候,接觸過GreenDAO,但由于那時(shí)的GreenDAO配置起來很繁瑣,需要自己創(chuàng)建java庫,所以就沒使用它.

但如今在3.0版本后,GreenDAO大大簡(jiǎn)化了使用流程,加上其本身存取快、體積小、支持緩存、支持加密等優(yōu)點(diǎn),使得它成為了一個(gè)更受歡迎的ORM解決方案.


升級(jí)

在版本迭代時(shí),我們經(jīng)常需要對(duì)數(shù)據(jù)庫進(jìn)行升級(jí),而GreenDAO默認(rèn)的DaoMaster.DevOpenHelper在進(jìn)行數(shù)據(jù)升級(jí)時(shí),會(huì)把舊表刪除,然后創(chuàng)建新表,并沒有遷移舊數(shù)據(jù)到新表中,從而造成數(shù)據(jù)丟失.

這在實(shí)際中是不可取的,因此我們需要作出調(diào)整。下面介紹數(shù)據(jù)庫升級(jí)的步驟與要點(diǎn).

第一步

新建一個(gè)類,繼承DaoMaster.DevOpenHelper.重寫onUpgrade(Database db, int oldVersion, int newVersion)方法,在該方法中使用MigrationHelper進(jìn)行數(shù)據(jù)庫升級(jí)以及數(shù)據(jù)遷移.

網(wǎng)上有不少M(fèi)igrationHelper的源碼,這里采用的是https://github.com/yuweiguocn/GreenDaoUpgradeHelper中的MigrationHelper.它主要通過創(chuàng)建一個(gè)臨時(shí)表,將舊表的數(shù)據(jù)遷移到新表中.

然后使用MyOpenHelper替代DaoMaster.DevOpenHelper來進(jìn)行創(chuàng)建數(shù)據(jù)庫等操作

第二步

在表實(shí)體中,調(diào)整其中的變量(表字段),一般就是新增/刪除/修改字段。注意:?

1)新增的字段或修改的字段,其變量類型應(yīng)使用基礎(chǔ)數(shù)據(jù)類型的包裝類,如使用Integer而不是int,避免升級(jí)過程中報(bào)錯(cuò).

2)根據(jù)MigrationHelper中的代碼,升級(jí)后,新增的字段和修改的字段,都會(huì)默認(rèn)被賦予null值.

第三步

將原本自動(dòng)生成的構(gòu)造方法以及getter/setter方法刪除,重新Build—>Make Project進(jìn)行生成.

第四步

修改Module下build.gradle中數(shù)據(jù)庫的版本號(hào)schemaVersion ,遞增加1即可,最后運(yùn)行app



混淆

# greenDAO開始

-keepclassmembersclass * extends org.greenrobot.greendao.AbstractDao {

public static java.lang.String TABLENAME;

}

-keepclass **$Properties

# If you do not use SQLCipher:

-dontwarn org.greenrobot.greendao.database.**

# If you do not use RxJava:

-dontwarn rx.**

# greenDAO結(jié)束

# 如果按照上面介紹的加入了數(shù)據(jù)庫加密功能,則需添加一下配置

#sqlcipher數(shù)據(jù)庫加密開始

-keepclass net.sqlcipher.** {*;}

-keepclass net.sqlcipher.database.** {*;}

#sqlcipher數(shù)據(jù)庫加密結(jié)束

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容