一、MMKV是什么?
MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。也是腾讯微信团队使用的技术。
支持的数据类型
- 支持以下 Java 语言基础类型:
boolean、int、long、float、double、byte[]
- 支持以下 Java 类和容器:
String、Set<String>
- 任何实现了
Parcelable
的类型
二、MMKV的优点
1、 高性能:MMKV使用了一些技术手段,如mmap文件映射和跨进程通信的共享内存,以实现更高效的数据存取操作。MMKV的性能比SharedPreferences快数十倍,尤其在读写大量数据时效果更加明显。
2、小存储体积:这是因为MMKV使用了一种更高效的序列化算法,并且将数据存储在二进制文件中,避免了XML解析和序列化的开销。相同数据量情况下,MMKV的存储体积可以减少50%以上。
3、 跨进程共享:MMKV支持多进程间的数据共享,这对于需要在多个进程之间传递数据的应用程序非常有用。MMKV通过共享内存和文件锁定机制来确保跨进程读写数据的一致性和安全性。
4、API简单易用:MMKV提供了简洁、易用的API,使数据存取变得更加方便。
三、使用方法
官方文档:MMKV——基于 mmap 的高性能通用 key-value 组件
1、添加如下依赖:
implementation 'com.tencent:mmkv:1.3.1'
2、初始化MMKV
MMKV 的使用非常简单,所有变更立马生效,无需调用 sync
、apply
。 在 App 启动时初始化 MMKV,设定 MMKV 的根目录(files/mmkv/)
例如:在您的应用程序的入口点(通常是Application类)中添加以下代码:
String rootDir = MMKV.initialize(this);
Log.e(TAG, "MMKV: "+rootDir);
这就是MMKV的存储路径
3、存储和读取数据
3 .1 获取全局MMKV实例
MMKV提供了一个全局的实例,也就是说只需要在Application
中加载一次就可以全局使用他了。
//获取全局MMKV
MMKV mmkv = MMKV.defaultMMKV();
3.2存储数据
int value = 1;
//存储数据
mmkv.encode("Id",value);
在这里可以看见MMKV是使用键值对的方法进行存储
3.3 读取数据
//读取数据
int idValue = mmkv.decodeInt("Id");
Log.e(TAG, "idValue: "+idValue);
上述代码将从名为"Id"的键中读取存储的值并将其分配给value。
注意事项:MMKV可以存储各种类型的数据,包括String、Int、Float、Double、 ByteArray等。您只需要根据需要使用相应的encode和decode方法
3.4 删除数据
//删除数据
mmkv.remove("Id");
//读取数据
int idValue = mmkv.decodeInt("Id");
Log.e(TAG, "idValue: "+idValue);
四、自定义MMKV
4.1 自定义mkkv的表名
如果不同业务需要区别存储,也可以单独创建自己的实例
String rootDir = MMKV.initialize(this);
Log.e(TAG, "MMKV: "+rootDir);
MMKV kv = MMKV.mmkvWithID("MyID");
Log.e(TAG, "MMKV: "+kv);
注意一定要先initialize
MMKV才能建立新的表
如果业务需要多进程访问,那么在初始化的时候加上标志位 MMKV.MULTI_PROCESS_MODE
:
MMKV kv = MMKV.mmkvWithID("InterProcessKV", MMKV.MULTI_PROCESS_MODE);
4.2 自定义MMKV路径
初始化时指定自定义的MMKV存储路径
String rootDir = MMKV.initialize(this, "/sdcard/mymmkv");
Log.e(TAG, "MMKV: "+rootDir);
五、SharedPreferences 迁移
- MMKV 提供了
importFromSharedPreferences()
函数,可以比较方便地迁移数据过来。 - MMKV 还额外实现了一遍
SharedPreferences
、SharedPreferences.Editor
这两个 interface,在迁移的时候只需两三行代码即可,其他 CRUD 操作代码都不用改。
//获取SharedPreferences实例:
SharedPreferences sharedPreferencesOld = getSharedPreferences("your_sharedPreferences_name", Context.MODE_PRIVATE);
//调用importFromSharedPreferences()进行数据迁移:
MMKV mmkv = MMKV.mmkvWithID("NewsharedPreferences");
mmkv.importFromSharedPreferences(sharedPreferencesOld);
//可选:删除旧的SharedPreferences
sharedPreferencesOld.edit().clear().apply();
六、MKKV的缺点
1、导致ANT
因为是同步存储数据,因此小的数据读写非常快,但是大的数据读写就不如SP了,同步存储大的数据会使得主线程卡顿导致ANT。
2、无备份
由于直接在磁盘存储,所以如果系统出现问题会导致数据直接丢失,在这方面SP是有备份的。
3、不支持复杂的数据类型
但是也没必要存储复杂数据类型,SP也不支持复杂数据类型,后面用Room存储复杂的数据类型就行了。