GreenDao2.2升級GreenDao3.0的適配之路

前言.爲何要升級到Greendao3.0?

1. 多人開發

以往的數據庫建表建Dao等操做要新開一個module,在統一的地方管理數據庫建表,如今能夠直接寫Entity。多人開發時本身管本身的Entity便可 不用像之前衝突成狗。html

2. 結構簡潔方便

以往是在寫CreateTable addEntity("")等方法建表,如今只須要在Entity裏使用3.0的註解語法java

3. 註解使用

之前的Entity是會常常生成和覆蓋的,因此不建議改Entity的代碼,因此就很差在Entity裏面加註解了,這也使得放棄gson的@SerializedName("id") 這個返回字段與自寫字段不一樣時的註解。3.0之後Greendao本身都用註解了那咱們也就能夠用了。sql

4. 數據庫安全

 數據庫加密 3.0的GreenDao提供了自帶加密的功能很是實用。數據庫

 

升級之路

官網說這裏升級有兩條路可走,一條是保留以前生成代碼的那個模塊,另外一條是遷移實體類而且刪除以前的其餘生成文件。這裏推薦第二種作法,第一種總感受升級的不完全會留坑。安全

 

1.將以前的Entity保留好

這裏能夠選擇遷移一下文件夾裏的Entity,而且直接將以前的生成配置給去掉。app

settings.gradle裏面的include去掉以前的module, 主build.gradle裏的preBuild.dependsOn那個模塊也去掉。

gradle

2.升級gradle

在build.gradle的dependence裏面升級版本號,改爲以下ui

compile 'org.greenrobot:greendao-generator:3.0.0'
compile 'org.greenrobot:greendao:3.0.1'  

 

3.改配置的地址

由於把以前用來生成的Module棄用了,因此要把一些以前在就Module配置的東西補到工程的build.gradle裏面。this

在頂部加上加密

apply plugin: 'org.greenrobot.greendao'

在dependencies{}下面加上

greendao {
    targetGenDir 'src/main/java'  //生成代碼放的路徑
    daoPackage 'com.XXX.platform.dao'
}

 

4.刪除派生部分,加上註解,主鍵,依賴,entity

將以前代碼裏的派生代碼刪除,好比getter setter方法,還有一些註釋包裹着的代碼/*ToOne*/  相似於下面都能刪了。

    /** To-one relationship, resolved on first access. */
    public OrderBase getOrderBase() {
        Long __key = this.orderId;
        if (orderBase__resolvedKey == null || !orderBase__resolvedKey.equals(__key)) {
            if (daoSession == null) {
                throw new DaoException("Entity is detached from DAO context");
            }
            OrderBaseDao targetDao = daoSession.getOrderBaseDao();
            OrderBase orderBaseNew = targetDao.load(__key);
            synchronized (this) {
                orderBase = orderBaseNew;
            	orderBase__resolvedKey = __key;
            }
        }
        return orderBase;

將以前被這個註釋包裹的屬性刪掉,並在前面加上@Transient

// KEEP INCLUDES - put your custom includes here
// 屬性代碼
// KEEP INCLUDES END
   
// KEEP FIELDS - put your custom fields here
// 屬性getter setter方法
// KEEP FIELDS END

下面的getset方法能夠保留,也可刪了讓他從新生成。 但這裏要說一下加了@Transient註解的屬性 不會自動生成getset方法,因此你能夠先run一次待他生成後再加上@Transient註解。

接下來就是把以前建立表的舊代碼的一些特殊寫法,改爲新版本的註解寫法。

在這段過程當中可能會常常改一點Run一下,這時能夠先不考慮工程裏的各類紅線,由於build的時候會先生成這些Dao,而後再編譯業務的代碼。因此當你看到下面的報錯已經和greendao無關時就說明這邊已經經過了。若是是greendao的生成報錯也不用擔憂,這些錯誤的描述都是精確位置和很是易懂的。

列出幾種錯誤:

Error:Execution failed for task ':platform:greendao'.
> Currently only single FK columns are supported: ToOne 'orderBase' from OrderXXX to OrderBase

上面沒有添加主鍵

Error:Execution failed for task ':platform:greendao'.
> Can't replace field in /Users/dsx/Documents/XXX/platform/src/main/java/com/XXX/platform/bean/OrderXXX.java:43 with generated version.//董鉑然 博客園
                      If you would like to keep it, it should be explicitly marked with @Keep annotation.
                      Otherwise please mark it with @Generated annotation

上面須要加上@keep

Error:Execution failed for task ':platform:greendao'.
> Can't add field `Variable(type=VariableType(name=com.xxx.platform.dao.OrderBase, isPrimitive=false, originalName=OrderBase, typeArguments=null), name=orderBase)` // 董尚先
for entity OrderXXX due to: Unsupported type com.xxx.platform.dao.OrderBase

上面須要設置好表關係。 應該是漏了ToOne或ToMany

 

5.先後語法對比

通常在幹這種升級操做以前應該都是對3.0語法有了解的了,若是不熟能夠看下這篇文章的註解部分。就是以前2.2的某某某代碼應該改成3.0的某某某註解

http://www.cnblogs.com/dsxniubility/p/5699543.html

 

6.把包名文件替換

全文搜索把包名替換成下面的

// old package name
import de.greenrobot.dao.database.Database;
...
 
// new package name
import org.greenrobot.greendao.database.Database;
...

 

7.最後解決一些編譯錯誤

1.DaoOpenHelper改爲DevOpenHelper

2.sqldatabase 換成database

3.getWritableDatabase()換成getWritableDb()

 

至此完成

相關文章
相關標籤/搜索