GreenDao2.2升级GreenDao3.0的适配之路

前言.为什么要升级到Greendao3.0?

1. 多人开发

以往的数据库建表建Dao等操作要新开一个module,在统一的地方管理数据库建表,现在可以直接写Entity。多人开发时自己管自己的Entity即可 不用像以前冲突成狗。

2. 结构简洁方便

以往是在写CreateTable addEntity("")等方法建表,现在只需要在Entity里使用3.0的注解语法

3. 注解使用

以前的Entity是会经常生成和覆盖的,所以不建议改Entity的代码,所以就不好在Entity里面加注解了,这也使得放弃gson的@SerializedName("id") 这个返回字段与自写字段不同时的注解。3.0以后Greendao自己都用注解了那我们也就可以用了。

4. 数据库安全

 数据库加密 3.0的GreenDao提供了自带加密的功能非常实用。

 

升级之路

官网说这里升级有两条路可走,一条是保留之前生成代码的那个模块,另一条是迁移实体类并且删除之前的其他生成文件。这里推荐第二种做法,第一种总感觉升级的不彻底会留坑。

 

1.将之前的Entity保留好

这里可以选择迁移一下文件夹里的Entity,并且直接将之前的生成配置给去掉。

settings.gradle里面的include去掉之前的module, 主build.gradle里的preBuild.dependsOn那个模块也去掉。

2.升级gradle

在build.gradle的dependence里面升级版本号,改成如下

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

 

3.改配置的地址

因为把之前用来生成的Module弃用了,所以要把一些之前在就Module配置的东西补到工程的build.gradle里面。

在顶部加上

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()

 

至此完成

posted @ 2016-08-08 09:27  董铂然  阅读(9769)  评论(2编辑  收藏  举报