大家好,在上一篇文章中,我主要介绍了GreenDao3.0的最基本的用法,当然也是最常用的用法,如果你的项目里没有特别复杂的多表关联需求的话,我相信那篇文章的知识点已经足够使用了。但是,如果你是一个求知欲特别强的人或者手上有要在本地创建复杂的数据库需求的话,我相信认真读完本篇文章,你一定会有所收获。
好了废话不多说,今天我们来学习下GreenDao的高级用法有哪些吧!阅读本篇文章前你需要对GreenDao有一定的了解,如果你对GreenDao了解还不够的话,建议先去阅读史上最高效的ORM方案——GreenDao3.0详解
目录
session 缓存
多表关联
多表查询
自定义参数类型
与数据库操作相关的AS插件
session 缓存
如果你有多个相同的查询语句去执行,猜猜看返回给你的对象是一个还是多个?比如说像下面这样
QueryBuilder projectQueryBuilder = projectDao
.queryBuilder()
.where(ProjectDao.Properties.UserName.eq("123456"));
Query query = projectQueryBuilder.build();
Project project1=query.unique();
QueryBuilder projectQueryBuilder1 = projectDao
.queryBuilder()
.where(ProjectDao.Properties.UserName.eq("123456"));
Query query2 = projectQueryBuilder1.build();
Project project2=query.unique();
答案是project1==project2而且project2查询出来的速度要比project1查询出来的速度快很多倍;
这是因为在同一个session中如果一个entities已经被session记录那么下一次再次操作该实体时,greenDao会先从内存中查找,如果内存中没有再去数据库中查找。这样一方面就极大的提高greenDao的查询效率,另一方面也是需要特别注意的是当entities更新过 greenDao仍然会从内存中取出旧值,所以如果entities更新过,需要去调用daoseesion.clear()方法清除缓存后才能查到最新值,否则查询到的将还是保存在内存中的值。
下面介绍下清除缓存有两种方法
清除所所有的缓存
daoSession.clear();
清除指定Dao类的缓存
projectDao = daoSession.getNoteDao();
projectDao.detachAll();
多表关联
1. 1:1关联
当我们在使用sqlite数据库来实现表的1:1关联时,通常我们会在主表中定义一个外键去关联副表,当要查询对应的数据时,首先我们要知道查询数据的外键,然后需要用外键去副表中查询所需要的数据。比如下面这样
public class Customer {
private Long id;
}
public class Order {
private Long id;
private Date date;
private long customerId;
}
Customer表通过id与Order表关联,查询Order的Custom