本文将会讲解greenDao的schema,entity,以及property的使用方法,如何在greenDao中使用继承,接口,序列化,以及保留自定义属性和方法等。
使用greenDao的第一步就是创建实体模型(entity model),用它来表示应用程序中使用的持久化数据。然后,greenDao基于这些模型生成Dao层的java代码。
Model本身也是java代码定义的。非常简单,基于DaoExampleGenerator创建一个java project。你可以查看(greenDao使用-快速上手)来了解详细代码。
右边展示的图例描述了meta model(元模型)。那就是用来描述领域模型的类。
Schema
Entities属于Schema的一部分。Schema是需要定义的第一个object。调用构造方法,其中包含两个参数,schema version和默认的Java package Schema schema = new Schema(1, “de.greenrobot.daoexample”); 默认的Java package用来作为entities,DAOs以及Junit tests的包名。第一步就这么愉快的完成了。
如果想DAO和test代码分别用不同的packages,可以像下面这样重新定义:
1 2 3 |
schema.setDefaultJavaPackageTest("de.greenrobot.daoexample.test"); schema.setDefaultJavaPackageDao("de.greenrobot.daoexample.dao"); |
Schema还有两个默认的flags用来控制entities,一个flag设置entities是否激活,如果需要用到keep sections(段落保持:保留自定义的字段和方法等,允许手动修改已经生成的entities)。这些特性还没有写入文档;但是可以从源码的测试工程中找到。
1 2 3 |
schema2.enableKeepSectionsByDefault(); schema2.enableActiveEntitiesByDefault(); |
Entities
创建了schema对象之后,就可以使用schema添加entities,entity有许多的属性可以设置,更重要的是你可以给它添加properties:
1 2 3 4 5 6 |
Entity user = schema.addEntity("User"); user.addIdProperty(); user.addStringProperty("name"); user.addStringProperty("password"); user.addIntProperty("yearOfBirth"); |
除了属性之外,还可以给entity添加many-to-one和one-to-many的关系。
Properties and primary keys
上一节讲解了如何给entity添加properties,Entity的addXXXProperty方法返回一个PropertyBuilder对象,用它来配置property。例如,使用columnName方法来覆盖默认的列名称。可以调用PropertyBuilder的getProperty方法创建一个property对象的引用。 主键约束(Current primary key (PK) restrictions): 目前,entities必须有一个主键(primary key),并且必须是long类型。这是Android和SQLite推荐的做法。greenDao在将来会支持其他类型的主键。关于这个问题,你可以使用一个long类型的主键,然后用一个逻辑上唯一的index来表达你的“key”属性。也就是说一个数据库层面的主键,一个逻辑意义上的主键(把逻辑主键加上索引)。
Defaults
greenDao以合理的默认配置运行,所以不需要做过多的配置。例如,数据库中的table name和column name就直接使用entity和property的名字。数据库的命名规范不是Java的驼峰风格,而是采用下划线分割单词并大写。例如,property名称是“creationDate”,那么在数据库中对应的column名称应该是“CREATION_DATE”。
Relations
Many-to-one和one-to-many关系详细讲解。
继承,接口,序列化(Inheritance, Interfaces, and Serializable)
Entities可以继承于非实体类(non-entity)。通过setSuperclass(String)方法来指定其父类(super class)。例如:
myEntity.setSuperclass("MyCommonBehavior");
注意:目前不支持entity作为父类(也就是说不支持多态查询)。
使用interface来表达entity属性和行为的基本操作是很好的做法。例如,如果entity A和B共享一些properties,这些properties的getters和setters方法就可以定义到interface C里面。就像下面所展示的代码一样,同时还设置entity B为Serializable:
1 2 3 4 |
entityA.implementsInterface("C"); entityB.implementsInterface("C"); entityB.implementsSerializable(); |
生成代码(Triggering generation)
Entity schema准备好之后,就可以生成代码了。执行generator project(一个普通的Java project拥有一个static main()方法),需要初始化一个DaoGenerator然后调用generateAll方法:
1 2 3 |
DaoGenerator daoGenerator = new DaoGenerator(); daoGenerator.generateAll(schema, "../MyProject/src-gen"); |
如代码所示,只需要传人schema和一个目标路径,通常就是Android项目的源码路径。如果想要test classes生成到另外的目录,可以指定另外一个目录作为第三个参数。
Keep sections
每次重新生成代码的时候(比如:数据库升级的时候,需要重新生成代码)Entity classes都会被重新写入。为了能够将自定义的代码被保留下来,greenDao提供了“keep sections”。用schema的enableKeepSectionsByDefault()或者entities的setHasKeepSections(true)方法开启。开启之后,三段keep section会在entities中生成。
1 2 3 4 5 6 7 8 9 |
// KEEP INCLUDES - put your custom includes here // KEEP INCLUDES END ... // KEEP FIELDS - put your custom fields here // KEEP FIELDS END ... // KEEP METHODS - put your custom methods here // KEEP METHODS END |
现在就可以将自定义的代码放入两个KEEP之间。注意:不要试图去修改注释。当代码重新生成的时候KEEP之间的代码会被保留。
注意:在重新生成代码之前,备份或者提交代码是一个很好的习惯,避免误操作带来的代码丢失。