前言
為了提高性能,DBFlow 支持緩存。這可以快速的獲取到你想要的數(shù)據(jù)。
注意1
- 默認(rèn)是不啟用緩存的,但可以很容易的去啟用緩存。
- 緩存用于model 的的查詢中。
注意2
如下情況,緩存應(yīng)該被使用:
- 從相同的 Model 中多次查詢。
- 對整個(gè) Model 對象做查詢。(基于主鍵 @PrimaryKey)
如下情況,緩存不應(yīng)該被使用:
- 執(zhí)行部分查詢或復(fù)雜的查詢。
- 當(dāng)你的Model被增刪改了。(出現(xiàn)這種情況,最好清除緩存!)
支持緩存的類
- SparseArray ---》SparseArrayBasedCache (platform SparseArray)
- Map ---》 SimpleMapCache
- LruCache ---》 ModelLruCache (copy of LruCache, so dependency avoided)
啟用緩存
針對有一個(gè)主鍵的表,用如下方式啟用:
@Table(database = AppDatabase.class, cachingEnabled = true)
public class CacheableModel extends BaseModel {
@Column
@PrimaryKey(autoincrement = true)
long id;
@Column
String name;
}
從數(shù)據(jù)庫中加載數(shù)據(jù)流程
當(dāng)從數(shù)據(jù)庫中獲取數(shù)據(jù)時(shí),我們?nèi)匀粫?huì)執(zhí)行一根完整的查詢,返回一個(gè)Cursor。通過檢查每一行的主鍵,若主鍵在緩存中存在,我們則直接返回該對象,這導(dǎo)致我們可能會(huì)跳過昂貴的轉(zhuǎn)換過程(提高查詢速度?。?/p>
注意多線程訪問緩存,對緩存的修改可能會(huì)出現(xiàn)問題哦!
高級
- 指定緩存的大小
@Table(cacheSize = {size})
- 自定義緩存
@ModelCacheFieldpublic static ModelCache<CacheableModel3, ?> modelCache = new SimpleMapCache<>(); // replace with any cache you want.
- 針對有多個(gè)主鍵的表,用如下方式啟用:
@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中存放的是你的聲明的主鍵的順序。