前言
MMKV是有腾讯开发的高性能key-value组件,可以完美替代SharedPreferences。
项目地址:https://github.com/Tencent/MMKV
使用
1.安装引入
dependencies {
implementation 'com.tencent:mmkv-static:1.1.1'
// "1.1.1" 可以被任何可用的版本替代
}
2.初始化
MMKV的使用也很简单,经过初始化后就能进行存取数据了,初始化一般放在Application的onCreate()方法中。
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT == 19) {
//一些 Android设备(API level 19)在安装/更新APK 时可能出错, 导致 libmmkv.so 找不到。
String dir = getFilesDir().getAbsolutePath() + "/mmkv";
MMKV.initialize(dir, new MMKV.LibLoader() {
@Override
public void loadLibrary(String libName) {
//开源库[ReLinker](https://github.com/KeepSafe/ReLinker) 专门解决这个问题
ReLinker.loadLibrary(MyApplication.this, libName);
}
});
} else {
//👇初始化代码,数据默认存储在:
//context.getFilesDir().getAbsolutePath() + "/mmkv"
MMKV.initialize(this);
}
}
除了上面的方法外,也提供了其他初始化方法,酌情使用:
//👇指定日志级别
initialize(Context context, MMKVLogLevel logLevel)
//👇指定存储地址和日志级别
initialize(String rootDir)
initialize(String rootDir, MMKVLogLevel logLevel)
//👇MMKV.LibLoader用来解决Android 设备(API level 19)在安装/更新 APK 时出错问题
initialize(String rootDir, MMKV.LibLoader loader)
initialize(String rootDir, MMKV.LibLoader loader, MMKVLogLevel logLevel)
3. CRUD 操作
介绍CRUD操作前,首先要了解MMKV支持的数据类型:
支持以下 Java 语言基础类型:
boolean、int、long、float、double、byte[]
支持以下 Java 类和容器:
String、Set、任何实现了Parcelable的类型
MMKV提供一个默认的全局实例,使用MMKV.defaultMMKV()获取,然后通过该实例进行CRUD 操作
MMKV kv = MMKV.defaultMMKV();
//所有类型的数据操作类似,👇以布尔值做统一示范
kv.encode("bool", true);
boolean bValue = kv.decodeBool("bool");
kv.removeValueForKey("bool");
kv.removeValuesForKeys(new String[]{"int", "long"});
boolean hasBool = kv.containsKey("bool");
4.区别存储
MMKV支持区别存储,可以满足将数据存储在不同文件的需求。
MMKV mmkv = MMKV.mmkvWithID("TEST");
mmkv.encode("bool", true);
5.多进程支持
无论是使用defaultMMKV还是mmkvWithID方法,上文介绍的方式都是d单进程的,如果需要多进程支持,需要传入标志位,如下:
//👇第二个参数是加密密钥,null表示明文,可以设置加密秘钥进行加密
MMKV mmkv = MMKV.defaultMMKV(MMKV.MULTI_PROCESS_MODE, null);
MMKV mmkvTest = MMKV.mmkvWithID("TEST", MMKV.MULTI_PROCESS_MODE);
6.SharedPreferences 迁移
如果你之前使用SharedPreferences存储了大量数据,MMKV提供了API帮助你快速进行数据迁移。
//SharedPreferences preferences = getSharedPreferences("TEST", MODE_PRIVATE);
//将👆SharedPreferences替换为👇MMKV
MMKV preferences = MMKV.mmkvWithID("TEST");
// 👇再将之前SharedPreferences的旧数据迁移至MMKV,并清空SharedPreferences
SharedPreferences old_man = getSharedPreferences("TEST", MODE_PRIVATE);
preferences.importFromSharedPreferences(old_man);
old_man.edit().clear().commit();
// MMKV实现了SharedPreferences和Editor接口,所以之前的数据存储不需要做任何变化👇
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");
// 无需调用 commit(),apply()方法存储数据,在put时,数据已经进行了存储,当然调用了也不妨事,MMKV中的这两个方法都是空实现
//editor.commit();