之前项目中用到了GreenDAO,使用的是2.X的版本,总结下来就是非常难用。2.X中是新建一个项目,然后再项目中配置各个实体的字段等相关属性,然后生成实体以及DAO操作相关的一些类。但是,当你修改了实体中的一些属性,并且这些属性又要在数据库中保存的时候,你会发现每次重新运行generator之前的改变都得重新再来一次。
GreenDAO中比较大的变化就是使用了注解和Gradle,而且生成方式也发生了逆向变化,现在是先自己新建实体,然后从实体生成DAO操作相关的一些类。
有两种方式使用最新的GreenDAO3,一种是保留用于生成的项目,另一种则是使用基于注解的实体生成方式。我们会注意到GreenDAO3之后,包名由之前的de.greenrobot 改为了 org.greenrobot。还要注意,de.greenrobot.daogenerator 变为了 org.greenrobot.greendao.generator。de.greenrobot.dao变为了org.greenrobot.greendao。
在你的build.gradle中加入以下内容:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
}
}
// In current version 3.0.0, this must precede the android plugin!
apply plugin: 'org.greenrobot.greendao'
dependencies {
compile 'org.greenrobot:greendao:3.0.1'
}
然后再Make Project 你会在build/generated/source/greendao中发现新生成的内容,build/generated/source/greendao是默认路径,可以去配置的,配置方法在接下来将会讲到。
// In the build.gradle file of your app project:
android {
...
}
greendao {
schemaVersion 2
}
schemaVersion 当前数据库结构的版本。结构版本变化时在OpenHelpers中被使用到。当你改变实体或者数据的结构时,这个值应该增加。
daoPackage 生成的DAO,DaoMaster和DaoSession的包名。默认是实体的包名。
targetGenDir 生成源文件的路径。默认源文件目录是在build目录中的(build/generated/source/greendao)。
generateTests 设置是否自动生成单元测试。
targetGenDirTest 生成的单元测试的根目录。
@Entity(
// 如果你有超过一个的数据库结构,可以通过这个字段来区分
// 该实体属于哪个结构
schema = "myschema",
// 实体是否激活的标志,激活的实体有更新,删除和刷新的方法
active = true,
// 确定数据库中表的名称
// 表名称默认是实体类的名称
nameInDb = "AWESOME_USERS",
// Define indexes spanning multiple columns here.
indexes = {
@Index(value = "name DESC", unique = true)
},
// DAO是否应该创建数据库表的标志(默认为true)
// 如果你有多对一的表,将这个字段设置为false
// 或者你已经在GreenDAO之外创建了表,也将其置为false
createInDb = false
)
public class User {
...
}
注意,使用Gradle Plugin时暂不支持多个数据库结构。
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "USERNAME")
private String name;
@NotNull
private int repos;
@Transient
private int tempUsageCount;
...
}
@Id 选定一个long/Long类型的字段作为实体的ID,即数据库中的主键。 @Property 让你自定义字段在数据库中的名称,如果为空,GreenDAO将根据驼峰法将其用”_”分割,并全部转为大写,如userName 变为 USER_NAME。 @NonNull 使字段在数据库中成为非空字段,通常都会将基本类型加上NonNull标志。 @Transient 使得字段不再持久化。
@Index 给对应的字段创建索引,可以使用以下参数进行自定义:
name: 自定义的名称。
unique: 添加唯一性标志,使得其值必须唯一。
@Entity
public class User {
@Id private Long id;
@Index(unique = true)
private String name;
}
@Unique 对数据库列添加唯一性限制。
@Entity
public class User {
@Id private Long id;
@Unique private String name;
}
@ToOne 定义一对一的关系。此注解适用于其他实体对象的字段。GreenDAO需要一个字段来和外联实体中的ID相对应,所以在joinProperty中制定这个字段。如果没有自定,则会自动生成一个字段。
@Entity
public class Order {
@Id private Long id;
private long customerId;
@ToOne(joinProperty = "customerId")
private Customer customer;
}
@Entity
public class Customer {
@Id private Long id;
}
@ToMany 定义和多个实体之间的关系。此注解适用于其他实体对象集合的字段。有三种方式可以用来实现多映射。
referencedJoinProperty:指定目标实体中与源实体相对应的外键。
@Entity
public class User {
@Id private Long id;
@ToMany(referencedJoinProperty = "ownerId")
private List ownedSites;
}
@Entity
public class Site {
@Id private Long id;
private long ownerId;
}
joinProperty: 对于复杂一点的关系可以定义一组@JoinProperty注解。每个@JoinProperty注解都需要有源实体中的源属性和对应实体中的引用属性。
@Entity
public class User {
@Id private Long id;
@Unique private String authorTag;
@ToMany(joinProperties = {
@JoinProperty(name = "authorTag", referencedName = "ownerTag")
})
private List ownedSites;
}
@Entity
public class Site {
@Id private Long id;
@NotNull private String ownerTag;
}
@JoinEntity 在做NM多对多映射的时候使用
@Entity
public class Site {
@Id private Long id;
@ToMany
@JoinEntity(
entity = JoinSiteToUser.class,
sourceProperty = "siteId",
targetProperty = "userId"
)
private List authors;
}
@Entity
public class JoinSiteToUser {
@Id private Long id;
private Long siteId;
private Long userId;
}
@Entity
public class User {
@Id private Long id;
}
使用体会:
升级到3.0后每次生成的DAO相关文件中总会报错,一个是DevOpenHelper中的方法名称发生了改变,还有就是DAOs中的bindValue(SQLiteStatement, T)没有了继承关系。
原文链接: https://blog.mrli.xyz/greendao3-init-use/