Android使用MMKV

870 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

MMKV

MMKV是腾讯开源的一个存储组件,它基于mmap内存映射,APP只管往里面写数据,回写到文件由操作系统负责,所以我们不必担心由于应用Crash而导致的数据丢失。

基本使用

引入依赖

 implementation 'com.tencent:mmkv:1.2.13'

初始化

MMKV.initialize()

默认初始化方法初始化之后存储路径为/data/user/0/项目包名/files/mmkv,我们也可以使用下面方式指定存储目录。

MMKV.initialize(context,"dir")

存储数据

MMKV支持boolean,int,float,double,byte[],String等类型

mmkv.encode("key_int", 100)
mmkv.encode("key_long", 101L)
mmkv.encode("key_float", 102.3F)
mmkv.encode("key_double", 104.5)
mmkv.encode("key_boolean",true)
mmkv.encode("key_byte_array","byte".toByteArray())
mmkv.encode("key_string","字符串")
mmkv.encode("key_string_set", setOf("字符串1","字符串1"))
mmkv.encode("key_parcelable",User("张三"))

读取数据

获取存储的数据也很简单,每一种数据类型都有对应的decode()方法。

mmkv.decodeBool("key_boolean")

移除数据

mmkv.remove("key_long")

SharedPreferences

在MMKV之前,我们一般使用Android系统提供的SharedPreferences存储小量数据,但是由于SharedPreferences每次更新都是全量更新,写入效率就比较低下,而且SharedPreferences存储的是xml文件,每次加载数据也是全量加载,不仅耗费加载时间,还会浪费大量内存,而MMKV正好解决了这些痛点。

储存结构

前面提到SharedPreferences是按照XML格式存储的文件,可读性比较高,我们可以导出文件直接查看存储的信息,而KKMV底层序列化/反序列化使用protobuf实现,虽然效率很高,但是可读性很低。而且MMKV不支持getAll()

public Map<String, ?> getAll() {
    throw new UnsupportedOperationException("Intentionally Not Supported. Use allKeys() instead, getAll() not implement because type-erasure inside mmkv");
}

因为MMKV在存储的时候是按照字节存储的,写入文件的时候吧类型给擦除了,这就导致MMKV不支持数据迁移的能力 ,如果将来需要更换新的存储框架,只能一个key一个key地迁移,非常麻烦。