很多人觉得Greendao缓存很烦人,于是每次都先清理缓存在查询,其实大可不必,既然这么设计就有这么设计的道理,首先我们的理解缓存的设计及实现原理
首先缓存在哪呢?如果我们先从load方法跳入看一下
public T load(K key) { assertSinglePk(); if (key == null) { return null; } if (identityScope != null) { T entity = identityScope.get(key); if (entity != null) { return entity; } } String sql = statements.getSelectByKey(); String[] keyArray = new String[]{key.toString()}; Cursor cursor = db.rawQuery(sql, keyArray); return loadUniqueAndCloseCursor(cursor); }
也就是说Greendao先查询identityScope这里,这里如果有值,那么就直接返回了,后面的sql就不执行了,这个对象想必就是缓存的数据的地方吧,我们找到这个变量看一下
protected final IdentityScope<K, T> identityScope;
是不是很像Map,根据关键字也就是主键保存值,我们这就很容易发现缓存的位置,接下来我们可以测试缓存什么时候,缓存可以提高我们的查询优化,减少IO操作
那么什么时候清理缓存比较合理呢?
我们发现如果对同一个查询结果,对他的一些属性或者关联表修改后,无法通过再次查询获取正确值,于是我们得出结论,在单纯的查询中我们没必要清理缓存,比如列表页查询集合,跳入详情页查询对象,这样的操作就没必要清理缓存,缓存会大大提高我们的查询效率,但是执行了插入、修改、删除,会影响我们查时,我们只清理该表的缓存,一般情况就是我们在网络获数据后有必要对该表执行一下清理缓存,那么什么情况下执行清理全部缓存(session缓存)呢?个人觉得场景比较少,退出登陆或者切换账号可能才有必要吧
Android菜鸟,欢迎吐槽