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

 

至此完成

相关文章
相关标签/搜索