之前项目用objectbox,现在改成greendao,记录一下自己用到的东西
导入
在build.gradle(app)下添加依赖
implementation 'org.greenrobot:greendao:3.2.2' // 添加依赖
同样在当前页面dependencies同级下添加
greendao {
// 指定数据库schema版本号,迁移等操作会用到
schemaVersion 3
// 设置生成数据库文件的目录,默认是在build中,可以将生成的文件放到我们的java目录中
targetGenDir 'src/main/java'
// 设置生成的数据库相关文件的包名,默认为entity所在的包名
daoPackage 'com.shufeng.greendao.gen'
}
还要在
apply plugin: 'com.android.application'下方添加
apply plugin: 'org.greenrobot.greendao' // 应用插件
在build.gradle(Project)下的dependencies下添加
// 添加插件
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
刷新项目,然后make project,就算导入完成了
entity
创建对应的entity
用@entity注解
@id注解主键
@Entity
public class Catalog implements Parcelable {
@Id(autoincrement = true)
public Long id;
然后builde一下,会自动生成对应的dao
DaoMaster和DaoSession都会自动生成
使用的时候可以写一个manager管理类
利用daosession获取对应表的dao来使用
插入数据
Catalog c = new Catalog ();
DataManager.getIntance.getCatalogDao().insert(c);
查询有多种方式
DataManager.getIntance.getCatalogDao().loadAll();
DataManager.getIntance.getCatalogDao().querryBuilder().list();
DataManager.getIntance.getCatalogDao().querryBuilder().where(CatalogDao.Properties.id.eq(1)).list;
删除delete
修改update
ToMany
根据官网文档:https://greenrobot.org/greendao/documentation/relations/
tomany有三种方式,我使用的是第一种方式
第一种:
referencedJoinProperty
指定目标实体中指向此实体id的“外键”属性的名称。
我使用时觉得就是将一个类的主键作为另一个类的外键,将两个或多个实例绑定
创建实体类father,使用referencedJoinProperty关联属性
创建实例son
两个实例创建完成,make project,会自动生成对应的dao
插入son(ThreadPoolUtils是我的一个工具类)
插入father
查询的方式有多种上面已经提了几种
查询son
查询father
经管目前我还没有将两者关联,但是reset方法同样可以写上,因为to many关系是存在缓存的,就是会缓存上一次查询的集合,我们需要reset方法清除缓存的集合
将部分son与father关联
这时候再查询father的时候,同样要调用reset方法
查询结果
解除关系和更换关系
只需要将待修改的son修改关联的id为目标id,然后更新数据库里面的数据
第二种:
JoinEntity
如果要处理涉及另一个联接实体/表的N:M(多对多)关系,请在属性上添加此附加注释。
使用的时候,用第三张表来保存两张表对应的关系
创建customer实体类
创建order实体类
创建两者关系的实体类
这个方法是N:N的方法,在order实体类里面同样可以加上joinEntity关键字
插入order
插入customer
将两种实体类关联
这样将一部分的实体类关联成功
查询customer所包含的order时候,customer也要调用reset方法,然后直接get
更改关系和删除关系,由于这种方法是N:M的,所以我用到的时候,反而是更换关系更多,值得注意的是,当我们执行更改关系的时候,可以说是新增关系,因为如果不删除原来的关系,那么第三张关系表中会存在原来的关系
删除关系
将当前的customer对象下的order清除
也可以单个删除,将需要解除关系的集合delete,注意是对关系表操作,所以order表和customer表里面的数据不会少
更换关系
将需要更换的order和新的customer绑定到第三张表里
注意,order原本绑定关系不会覆盖
如果想要删除原本的关系,再更新到新的关系,这里我目前没有发现好的办法,希望大家一起学习探讨
第三种:
joinProperties
对于更复杂的关系,可以指定@JoinProperty注释的列表。每个@JoinProperty都需要原始实体中的源属性和目标实体中的引用属性。
这种方式和上面的区别在于,可以用不限于Long型作为外键,可以使用其他的类型作为外键
创建human实体类
这里的joinProperty里面,就是将本类的sex作为源属性,male是目标实体中的引用属性,两者相关联
这里我们用N:N,所以再创建一个man实体类
和human实体类一样,这里要注意,两个表之间可以互相多对多,但是最好不要用同一个属性,这样在表查询的时候,可能会出现数据错乱
增删的方法就是普通方法
将human插入到man
将man插入到human
这样对应的数据是不会错乱的,关系并没有交叉
目前学到这些基础的,后续还会深入学习
新增字段
当数据库已经写好实用之后,要想新增字段
1.在对应的类里面加上要新增的字段,我新增了一个sonTag字段
2.在bulid文件里面增加数据库版本号
3.make project就可以了
demo地址:https://github.com/erwoooo/DbGreen.git