Android GreenDao 坑 查询缓存问题

Greendao 查询不到真实数据的解决方法 清除greendao缓存,

 

项目的数据库查询是用的第三方 ORM库存 Greendao  ;

在修改数据后,反复查询得不到更新后的数据?导出数据库,发现数据已更新,使用原查询数据库,也已经更新?原凶就是GreenDao,自动缓存了数据

 

 

记录一下清除greendao 缓存的方法
第一种清除daoSession的缓存
 
daoSession.clear();
第二种 清除指定dao类的缓存
 
dao.detachAll();

注意:

Greendao 到数据查询是带缓存的查询,将搜索过的数据会生成缓存,查询的时候会先查询缓存, 节约资源,提高效率,

。使用的时候要注意。

这个错误是由于查询结果集太大,超过了 `CursorWindow` 的限制所导致的。`CursorWindow` 是 Android 中用于缓存查询结果的内存结构,它的大小是受限的,一般为 2MB 左右。 针对这个问题,可以通过以下几种方式来解决: 1. 增加每次查询的限制 可以通过在查询时增加查询的限制,每次只查询少量的数据,避免查询结果集太大。例如: ```java QueryBuilder<Data> builder = daoSession.getDataDao().queryBuilder(); builder.limit(100); // 每次查询100条数据 List<Data> dataList = builder.list(); ``` 2. 分页查询数据 可以通过分页查询数据的方式来避免查询结果集太大。例如: ```java QueryBuilder<Data> builder = daoSession.getDataDao().queryBuilder(); builder.limit(pageSize); // 每页查询的数量 builder.offset(pageSize * pageIndex); // 查询的偏移量,即从第几条数据开始查询 List<Data> dataList = builder.list(); ``` 3. 使用 Projection 查询部分字段 如果查询结果中的一些字段不是必要的,可以使用 Projection 查询部分字段,减少查询结果集的大小。例如: ```java QueryBuilder<Data> builder = daoSession.getDataDao().queryBuilder(); builder.projectColumns(DataDao.Properties.Id, DataDao.Properties.Name); // 只查询id和name字段 List<Data> dataList = builder.list(); ``` 4. 压缩数据 如果查询结果集中包含大量的文本或二进制数据,可以考虑使用压缩算法对数据进行压缩,减小查询结果集的大小。例如: ```java QueryBuilder<Data> builder = daoSession.getDataDao().queryBuilder(); builder.where(DataDao.Properties.Id.eq(id)); Data data = builder.unique(); byte[] compressedData = compress(data.getContent()); // 压缩数据 ``` 以上是一些可能的解决方案,具体应该根据具体情况进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值