我正在使用 GreenDao 并创建一个核心函数来帮助您更新实体的某些值,如果实体不在数据库中,那么它也会插入它。问题是我总是得到实体的缓存副本,我知道 GreenDao 管理一些简单的缓存,我希望能够绕过它。有谁知道我如何直接从数据库中查询?
这不起作用
.Dao().queryBuilder().where(comDao.Properties.Id.eq(id)).build().listLazyUncached();
GreenDao 确实在其 daoCore.jar 源中具有内部缓存机制。
您可以通过从缓存中搜索 put() 和 get() 实体的代码轻松禁用缓存。
which is a: HashMap<? extends AbstractDao>.
然后生成 MyDaoCore.jar 并将其添加到您的项目中。
其次,为了更新或插入实体(而不是完全替换它),您需要实现以下伪代码。很抱歉我没有添加实际代码,我很久以前就解决了。
public void insertOrUpdate(List<? extends AbstractDao> entities){
List<Entity> toInsert;
List<Entity> toUpdate;
for (Entity e : entities)
{
if( e.inDatabase() )
toUpdate.add(e);
else
toInsert.add(e);
}
Dao.updateAll(toUpdate);
Dao.insertAll(toInsert);
}
编辑 1:您可以使用 IN 语句,以便仅在一个查询中获取实体的所有 id,如下所示:
.where(Dao.Properties.Id.in(ids)).build().list();