Greendao的缓存使用

很多人觉得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菜鸟,欢迎吐槽

你可能感兴趣的:(android)