GreenDao3.0学习(To Many)

之前项目用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

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值