前言
为了提高性能,DBFlow 支持缓存。这可以快速的获取到你想要的数据。
注意1
- 默认是不启用缓存的,但可以很容易的去启用缓存。
- 缓存用于model 的的查询中。
注意2
如下情况,缓存应该被使用:
- 从相同的 Model 中多次查询。
- 对整个 Model 对象做查询。(基于主键 @PrimaryKey)
如下情况,缓存不应该被使用:
- 执行部分查询或复杂的查询。
- 当你的Model被增删改了。(出现这种情况,最好清除缓存!)
支持缓存的类
- SparseArray ---》SparseArrayBasedCache (platform SparseArray)
- Map ---》 SimpleMapCache
- 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。通过检查每一行的主键,若主键在缓存中存在,我们则直接返回该对象,这导致我们可能会跳过昂贵的转换过程(提高查询速度!)。
注意多线程访问缓存,对缓存的修改可能会出现问题哦!
高级
- 指定缓存的大小
@Table(cacheSize = {size})
- 自定义缓存
@ModelCacheFieldpublic static ModelCache<CacheableModel3, ?> modelCache = new SimpleMapCache<>(); // replace with any cache you want.
- 针对有多个主键的表,用如下方式启用:
@Table(database = AppDatabase.class, cachingEnabled = true)
public class Coordinate extends BaseModel {
@MultiCacheField
public static final IMultiKeyCacheConverter<String> multiKeyCacheModel = new IMultiKeyCacheConverter<String>() {
@Override
@NonNull
public String getCachingKey(@NonNull Object[] values) {
return "(" + values[0] + "," + values[1] + ")";
}
};
@PrimaryKey
double latitude;
@PrimaryKey
double longitude;
请注意该字段:public static final IMultiKeyCacheConverter<String> multiKeyCacheModel
---> <String>:指定对象返回的类型。
---> 方法getCachingKey:Object[] values中存放的是你的声明的主键的顺序。