前言
greenDAO3.x使用注解来定义模式和实体。相比之下,以前greenDAO版本要求开发人员有一个单独的分离的Java项目来构造数据库帮助类。现在你仍然可以这么做,然而greenDAO3.x允许使用注解来自由的创建模式和实体。
例如:
这个@Entity注解就会将Java类”User”转化成一个表的实体类,当然也会指导greendao去生成必要的代码,例如DAOs,代码是在build项目的时候生成的。
添加依赖和插件
注:请去官方github使用最新的版本
现在,当你build项目的时候,就会执行生成greendao代码。在Android Studio中,当你选择build->make project的时候,也会触发。默认情况下,在build/generated/source/greendao目录下生成代码,将这个目录添加为gradle build时的资源目录。
温馨提示:如果你觉得生成的代码有错误,请首先检查build/generated/source/greendao目录。
Gradle插件配置
我们可以使用gradle插件来进行生成项目,不需要多余的配置。
在greendao节点下可以进行的配置:
- schemaVersion:当前数据库版本,该参数将会被 ***OpenHelper这个类来使用在模式版本间迁移。如果你想改变你的实体类/数据库版本,这个数值应该增长。
- daoPackage:生成的dao类存放的包名;
- targetGenDir:生成代码的存放地址;
实体类和注解
greenDAO3使用了一些注解,有些灵感来自JPA(Java Persistence API)。然而,我们简化和调整greenDAO细节。
-
@Entity 类注解
就像你在例子中看到的一样,@Entity这个注解将这个Java类变成greendao的持久化类。通常情况下,可以直接使用而不配置任何的参数,当然你也可以配置下面的参数:
-
@Id,@Property等基础属性注解
- @Id:该注解选择一个long类型的属性作为实体类的ID。在数据库里面,它就是主键。这个参数 autoincrement 是一个标记,标志着ID一直都是增长的,从不适用旧值;
- @Property:使用该属性定义一个非默认的列名,该变量和该列进行映射。如果缺少,greendao会使用这个变量名来命名数据库的列名(全部大写,并且使用下划线来代替驼峰命名法,eg:customName会变成CUSTOM_NAME)。
- NotNull:非空,通常情况下修饰基础类型,比如long,int,short,byte,当然也可以是包装类:Long,Integer,Short,Byte。
- @Transient:表示该属性不是持久化的,仅仅作为临时变量使用。
-
@Index,@Unique 索引注解
- @Index 使用该属性来创建一个数据库索引对应的数据库列。
name:重命名列名称,不适用默认的;
unique:索引添加一个唯一约束,强制所有的索引都是唯一的; - @Unique 给数据库的列添加一个唯一约束,注意,SQLite也会隐式地创建一个索引。
- @Index 使用该属性来创建一个数据库索引对应的数据库列。
-
关系注解:@ToOne, @ToMany
@ToOne:顶一个与另一个实体(一个实体对象)的关系。Property使用该注解表示持有另一个实体类的引用。在内部,需要有一个附加的属性来指向目标类的ID,这个也是joinProperty参数的数值。如果该参数缺省,会自动生成一列来持有这个key(目标类的ID)。
@ToMany
定义一个实体类集合的映射,使用这个属性可以表示一个目标实体类的集合。这个目标实体类必须有一个或者多个属性指向原始的类(拥有@Tomany属性的类)。这里有三种使用的可能:
生成代码
在greenDao3中,实体类是开发者创建和编辑的。然而,在代码生成过程中greenDAO可能增加实体的源代码。当它这么做的时候,它将一个@generated注释添加到生成的方法和字段上来通知开发人员,并防止任何代码损失。在大多数情况下,你都不需要碰触@Generated注解修饰的代码。
作为一个预先提醒,如果生成的代码被手动修改了,那么greendao不会覆盖已经存在的代码,并且给出错误提示信息。
就像错误信息提示的那样,有两种方法可以解决这个问题:
- @Generated:使用该注解恢复代码。或者,你也可以完全删除更改的构造函数或方法。他们将再下一次build的时候构建。
- @Keep:使用keep注解代替generated注解。这将告诉greenDAO从未接触带注释的代码。请记住,您的更改可能会打破实体之间的合同和其他greenDAO。