DBFlow文档:缓存

前言

为了提高性能,DBFlow 支持缓存。这可以快速的获取到你想要的数据。

注意1

  1. 默认是不启用缓存的,但可以很容易的去启用缓存。
  2. 缓存用于model 的的查询中。

注意2
如下情况,缓存应该被使用:

  1. 从相同的 Model 中多次查询。
  2. 对整个 Model 对象做查询。(基于主键 @PrimaryKey)

如下情况,缓存不应该被使用:

  1. 执行部分查询或复杂的查询。
  2. 当你的Model被增删改了。(出现这种情况,最好清除缓存!)

支持缓存的类

  1. SparseArray ---》SparseArrayBasedCache (platform SparseArray)
  2. Map ---》 SimpleMapCache
  3. LruCache ---》 ModelLruCache (copy of LruCache, so dependency avoided)

启用缓存

针对有一个主键的表,用如下方式启用:

@Table(database = AppDatabase.class, cachingEnabled = true)
public class CacheableModel extends BaseModel {

    @Column
    @PrimaryKey(autoincrement = true)
    long id;

    @Column
    String name;
}

从数据库中加载数据流程

当从数据库中获取数据时,我们仍然会执行一根完整的查询,返回一个Cursor。通过检查每一行的主键,若主键在缓存中存在,我们则直接返回该对象,这导致我们可能会跳过昂贵的转换过程(提高查询速度!)。

注意多线程访问缓存,对缓存的修改可能会出现问题哦!

高级

  1. 指定缓存的大小
@Table(cacheSize = {size})
  1. 自定义缓存
@ModelCacheFieldpublic static ModelCache modelCache = new SimpleMapCache<>(); // replace with any cache you want.
  1. 针对有多个主键的表,用如下方式启用:
@Table(database = AppDatabase.class, cachingEnabled = true)
public class Coordinate extends BaseModel {

    @MultiCacheField
    public static final IMultiKeyCacheConverter multiKeyCacheModel = new IMultiKeyCacheConverter() {

        @Override
        @NonNull
        public String getCachingKey(@NonNull Object[] values) {
            return "(" + values[0] + "," + values[1] + ")";
        }
    };

    @PrimaryKey
    double latitude;

    @PrimaryKey
    double longitude;

请注意该字段:public static final IMultiKeyCacheConverter multiKeyCacheModel
---> :指定对象返回的类型。
---> 方法getCachingKey:Object[] values中存放的是你的声明的主键的顺序。

你可能感兴趣的:(DBFlow文档:缓存)