前言
MMKV是有騰訊開發(fā)的高性能key-value組件,可以完美替代SharedPreferences季率。
項(xiàng)目地址:https://github.com/Tencent/MMKV
使用
1.安裝引入
dependencies {
implementation 'com.tencent:mmkv-static:1.1.1'
// "1.1.1" 可以被任何可用的版本替代
}
2.初始化
MMKV的使用也很簡(jiǎn)單骄瓣,經(jīng)過(guò)初始化后就能進(jìn)行存取數(shù)據(jù)了鳖昌,初始化一般放在Application的onCreate()方法中央渣。
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT == 19) {
//一些 Android設(shè)備(API level 19)在安裝/更新APK 時(shí)可能出錯(cuò), 導(dǎo)致 libmmkv.so 找不到硅卢。
String dir = getFilesDir().getAbsolutePath() + "/mmkv";
MMKV.initialize(dir, new MMKV.LibLoader() {
@Override
public void loadLibrary(String libName) {
//開源庫(kù)[ReLinker](https://github.com/KeepSafe/ReLinker) 專門解決這個(gè)問題
ReLinker.loadLibrary(MyApplication.this, libName);
}
});
} else {
//??初始化代碼射窒,數(shù)據(jù)默認(rèn)存儲(chǔ)在:
//context.getFilesDir().getAbsolutePath() + "/mmkv"
MMKV.initialize(this);
}
}
除了上面的方法外藏杖,也提供了其他初始化方法,酌情使用:
//??指定日志級(jí)別
initialize(Context context, MMKVLogLevel logLevel)
//??指定存儲(chǔ)地址和日志級(jí)別
initialize(String rootDir)
initialize(String rootDir, MMKVLogLevel logLevel)
//??MMKV.LibLoader用來(lái)解決Android 設(shè)備(API level 19)在安裝/更新 APK 時(shí)出錯(cuò)問題
initialize(String rootDir, MMKV.LibLoader loader)
initialize(String rootDir, MMKV.LibLoader loader, MMKVLogLevel logLevel)
3. CRUD 操作
介紹CRUD操作前脉顿,首先要了解MMKV支持的數(shù)據(jù)類型:
- 支持以下 Java 語(yǔ)言基礎(chǔ)類型:
boolean蝌麸、int、long艾疟、float来吩、double、byte[] - 支持以下 Java 類和容器:
String蔽莱、Set<String>弟疆、任何實(shí)現(xiàn)了Parcelable的類型
MMKV提供一個(gè)默認(rèn)的全局實(shí)例,使用MMKV.defaultMMKV()獲取盗冷,然后通過(guò)該實(shí)例進(jìn)行CRUD 操作
MMKV kv = MMKV.defaultMMKV();
//所有類型的數(shù)據(jù)操作類似怠苔,??以布爾值做統(tǒng)一示范
kv.encode("bool", true);
boolean bValue = kv.decodeBool("bool");
kv.removeValueForKey("bool");
kv.removeValuesForKeys(new String[]{"int", "long"});
boolean hasBool = kv.containsKey("bool");
4.區(qū)別存儲(chǔ)
MMKV支持區(qū)別存儲(chǔ),可以滿足將數(shù)據(jù)存儲(chǔ)在不同文件的需求仪糖。
MMKV mmkv = MMKV.mmkvWithID("TEST");
mmkv.encode("bool", true);
5.多進(jìn)程支持
無(wú)論是使用defaultMMKV還是mmkvWithID方法嘀略,上文介紹的方式都是d單進(jìn)程的,如果需要多進(jìn)程支持乓诽,需要傳入標(biāo)志位帜羊,如下:
//??第二個(gè)參數(shù)是加密密鑰,null表示明文鸠天,可以設(shè)置加密秘鑰進(jìn)行加密
MMKV mmkv = MMKV.defaultMMKV(MMKV.MULTI_PROCESS_MODE, null);
MMKV mmkvTest = MMKV.mmkvWithID("TEST", MMKV.MULTI_PROCESS_MODE);
6.SharedPreferences 遷移
如果你之前使用SharedPreferences存儲(chǔ)了大量數(shù)據(jù)讼育,MMKV提供了API幫助你快速進(jìn)行數(shù)據(jù)遷移。
//SharedPreferences preferences = getSharedPreferences("TEST", MODE_PRIVATE);
//將??SharedPreferences替換為??MMKV
MMKV preferences = MMKV.mmkvWithID("TEST");
// ??再將之前SharedPreferences的舊數(shù)據(jù)遷移至MMKV稠集,并清空SharedPreferences
SharedPreferences old_man = getSharedPreferences("TEST", MODE_PRIVATE);
preferences.importFromSharedPreferences(old_man);
old_man.edit().clear().commit();
// MMKV實(shí)現(xiàn)了SharedPreferences和Editor接口奶段,所以之前的數(shù)據(jù)存儲(chǔ)不需要做任何變化??
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("bool", true);
editor.putInt("int", Integer.MIN_VALUE);
editor.putLong("long", Long.MAX_VALUE);
editor.putFloat("float", -3.14f);
editor.putString("string", "hello, imported");
// 無(wú)需調(diào)用 commit(),apply()方法存儲(chǔ)數(shù)據(jù)剥纷,在put時(shí)痹籍,數(shù)據(jù)已經(jīng)進(jìn)行了存儲(chǔ),當(dāng)然調(diào)用了也不妨事晦鞋,MMKV中的這兩個(gè)方法都是空實(shí)現(xiàn)
//editor.commit();
以上內(nèi)容在官方文檔中都有詳細(xì)說(shuō)明蹲缠,還有日志,Native Buffer悠垛,數(shù)據(jù)恢復(fù)等內(nèi)容线定,參見:https://github.com/Tencent/MMKV/wiki/android_advance_cn