MMKV键值对存储
简介
MMKV是腾讯推出的基于mmap内存映射的key-value组件,底层序列化和反序列化使用protobuf实现,性能高,稳定性强。
与SharedPreferences的对比
1. 数据加密
SharedPreferences只是把键值对保存在本地文件中,没有自主进行数据的加密;而MMKV使用了AES CFB-128算法来加密和解密数据。
2.迁移方便
SharedPreferences已存储的数据可以通过简单的代码迁移到MMKV中。
3.支持更多的数据类型
MMKV支持Java语言基础类型:boolean、int、long、float、double、byte[]等,还支持String类和容器Set< String>等。
MMKV的使用
添加依赖
dependencies {
implementation 'com.tencent:mmkv:1.3.1'
}
初始化
public class ThisApp extends Application {
@Override
public void onCreate() {
super.onCreate();
MMKV.initialize(this);
}
}
定义一个继承于Application的类,并在AndroidManifest.xml文件中声明。MMKV将会在App启动时初始化好。
CRUD操作
MMKv mmkv = MMKV.defaultMMKV();
//使用MMKV.defaultMMKV()可以获取到MMKV的全局实例(单例)。
写入数据
mmkv.encode("data1", "写入的数据");
mmkv.encode("data2", 12);
byte[] bytes = {'m', 'm', 'k', 'v'};
mmkv.encode("bytes", bytes);
赋给同一个key不同的值就可以更新数据。
读取数据
Log.d("TAG", "onCreate: data1" + mmkv.decodeString("data1"));
Log.d("TAG", "onCreate: data2" + mmkv.decodeInt("data2"));
Log.d("TAG", "onCreate: data" + Arrays.toString(mmkv.decodeBytes("bytes")));
删除数据
//通过指定的一个key移除一个键值对
mmkv.removeValueForKey("data1");
//通过多个key移除多个键值对
mmkv.removeValuesForKeys(new String[]{"data2", "bytes"});
另外还有:
MMKV的实例还有这几个清空方法和计数方法。
mmkv.allkeys();//获取全部的key值
mmkv.containsKey("data1");//判断是否包含key
-
如果不同业务需要区别存储,也可以单独创建自己的实例:
MMKV m = MMKV.mmkvWithID("FirstMMKV");
m.encode("bool", true);
MMKV mm = MMKV.mmkvWithID("SecondMMKV");
Log.d("TAG", "onCreate: " + mm.containsKey("bool"));//false
通过不同的ID生成相互独立的mmkv。
-
如果业务需要多进程访问,可以在初始化的时候加上标志位MMKV.MULTI_PROCESS_MODE
MMKV mmm = MMKV.mmkvWithID("ThirdMMKV", MMKV.MULTI_PROCESS_MODE);
-
自定义根目录
MMKV默认会把文件存放在$(FilesDir)/mmkv/目录里,这个FileDir可以根据初始化的MMKV的返回值得到。
public class ThisApp extends Application {
@Override
public void onCreate() {
super.onCreate();
String fileDir = MMKV.initialize(this);
Log.d("TAG", "onCreate: " + fileDir);
}
}
也可以在初始化时自定义根目录:
String fileDir = getFilesDir().getAbsolutePath() + "mmkv_0";
String rootDir = MMKV.initialize(this, fileDir);
Log.d("TAG", "onCreate: " + rootDir);
还支持将某个MMKV的实例定义到自定义的目录中 使用时:
String mmkvDir = getFilesDir().getAbsolutePath() + "firstMMKV";
MMKV mmkv = MMKV.mmkvWithID("FirstMMKV", mmkvDir);
SharedPreferences迁移到MMKV
调用MMKV的实例的importFromSharedPreferences()方法实现迁移。
MMKV m = MMKV.mmkvWithID("MMKV");
SharedPreferences sp = getSharedPreferences("SP", MODE_PRIVATE);
m.importFromSharedPreferences(sp);//将SharedPreferences的实例传入
//正常使用SharedPreferences
@SuppressLint("CommitPrefEdits")
SharedPreferences.Editor spe = sp.edit();
spe.putInt("Int", 233);
spe.commit();//这里的commit不用也可以
Log.d("TAG", "onCreate: " + m.decodeInt("Int"));
m.importFromSharedPreferences(sp);可以写在数据写入之前或数据写入之后,任何地方。