官方api文档
SQLite可视化工具下载地址 Personal为免费版本
配置
在项目build.gradle中配置
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0'
}
在你要使用的模块下的build.gradle配置(我是直接在app模块下)
apply plugin: 'org.greenrobot.greendao'
greendao {
// 指定数据库schema版本号,迁移等操作会用到
schemaVersion 1
// 通过gradle插件生成的数据库相关文件的包名,默认为你的entity所在的包名
daoPackage 'com.example.greendao.dao'
// 生成的数据库文件默认目录为:build/generated/source/greendao
// 自定义生成数据库文件的目录,可以将生成的文件放到java目录中,而不是build中,这样就不用额外的设置资源目录了
targetGenDir 'src/main/java'
}
dependencies {
compile 'org.greenrobot:greendao:3.1.0'
}
greendao build配置
schemaVersion: 数据库schema版本,也可以理解为数据库版本号
daoPackage:设置DaoMaster 、DaoSession、Dao包名
targetGenDir:设置DaoMaster 、DaoSession、Dao目录
targetGenDirTest:设置生成单元测试目录
generateTests:设置自动生成单元测试用例
实体@Entity注解
schema:告知GreenDao当前实体属于哪个schema
active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
nameInDb:在数据中使用的别名,默认使用的是实体的类名
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表
基础属性注解
@Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb=”name”)
@NotNul:设置数据库表当前列不能为空
@Transient :添加次标记之后不会生成数据库表的列
索引注解
@Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
@Unique:向数据库列添加了一个唯一的约束
关系注解
@ToOne:定义与另一个实体(一个实体对象)的关系
@ToMany:定义与多个实体对象的关系
使用
我的entity是写在com.example.greendao.entity包下,当编译的时候,系统会自动找到@Entity注解过的类,在com.example.greendao.dao下产生greendao所需的类(这个包在build.gradle中指定了daoPackage,否则会在build/generated/source/greendao下)。
为了测试方便,写了三种entity类:person,animal.house,body,PersonWithHouse类,默认的测试关系是person和animal是1:N,person和body是1:1,person和house是N:M,PersonWithHouse是person和house的联系。
@Entity
public class Person {
//自增id类型只能是Long
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "user")
private String username;
private int age;
private Long bodyId;
//一对一,将Person表中的bodyId与body的主键关联
@ToOne(joinProperty = "bodyId")
private Body body;
//一对多
@ToMany(referencedJoinProperty = "ownerId")
private List<Animal> animals;
//多对多
@ToMany
@JoinEntity(
entity = PersonWithHouse.class,
sourceProperty = "personId",
targetProperty = "houseId"
)
private List<House> personWithHouse;
//get,set方法编译后会自动产生
}
@Entity
public class Animal {
@Id(autoincrement = true)
private Long id;
private Long ownerId;
private String name;
}
@Entity
public class Body {
@Id(autoincrement = true)
private Long id;
private int height;
private int weight;
}
@Entity
public class House {
@Id(autoincrement = true)
private Long id;
private String location;
private String price;
@ToMany
@JoinEntity(
entity = PersonWithHouse.class,
sourceProperty = "houseId",
targetProperty = "personId"
)
private List<Person> personList;
}
@Entity
public class PersonWithHouse {
@Id(autoincrement = true)
private Long id;
private Long personId;
private Long houseId;
}
封装
//在application中初始化MyDatabaseLoader.init(this,"greendao_db",null);
public class MyDatabaseLoader {
private static DaoSession daoSession;
public static void init(Context context,String databaseName,MyDataBaseOpenHelper.DataOpenHelper update){
MyDataBaseOpenHelper openHelper = new MyDataBaseOpenHelper(context,databaseName,null,update);
SQLiteDatabase database = openHelper.getWritableDatabase();
DaoMaster daoMaster =new DaoMaster(database);
daoSession = daoMaster.newSession();
}
public static DaoSession getDaoSession() {
return daoSession;