针对 mmkv 简单使用封装。实际使用中发现对序列化对象不太有用。还有个问题就是在使用时,不同的类如果属性名一样,其实相当于是用的同一个(其实就是使用的是同一个 key 值),这种写法虽然省去了写 key 值,但是有几个缺点,一是属性名一样相当于 key 一样,所以用到同一个对象时就要记住这个属性名。二是对于在不同的类,有时名称不可避免会一样,但是又不是用的同一个对象,这时就必须要起一个不一样的属性名。

让一个类实现 MMKVOwner 接口,即可通过 by mmkvXXXX() 方法将属性委托给 MMKV,例如:

  1. object DataRepository : MMKVOwner {
  2. var isFirstLaunch by mmkvBool(default = true)
  3. var user by mmkvParcelable<User>()
  4. }

设置或获取属性的值则调用对应的 encode 或 decode 方法,key 值为属性名。
支持以下类型:

方法 默认值
mmkvInt() 0
mmkvLong() 0L
mmkvBool() false
mmkvFloat() 0f
mmkvDouble() 0.0
mmkvString() /
mmkvStringSet() /
mmkvBytes() /
mmkvParcelable() /

在 MMKVOwner 的实现类可以获取 kv 对象进行删除值或清理缓存等操作:

  1. kv.removeValueForKey(::isFirstLaunch.name)
  2. kv.clearAll()

如果不同业务需要区别存储,可以重写 kv 属性来创建不同的 MMKV 实例:

  1. object DataRepository : MMKVOwner {
  2. override val kv: MMKV = MMKV.mmkvWithID("MyID")
  3. }

MMKV-KTX 和 MK 封装混合使用示例

对于简单的基本数据类型,可以使用 MMKV-KTX,比较方便,不用设置 key,值设置了就保存了。只要类实现MMKVOwner接口即可使用,如果想使用 mk 封装,可以直接使用 kv,就是 MMKV 对象,直接使用 MK 封装的扩展函数。同时提供了重新方法修改 MMKV。当然如果想直接使用 MK 封装,直接调用 mk() 即可初始 MMKV 对象。

  1. class TestMK: MMKVOwner {
  2. var isFirst by mmkvBool(false)
  3. fun setValue(){
  4. isFirst = true
  5. mk().encode("user" to User("alice",11))
  6. }
  7. fun getValue(){
  8. val string = mk().string("user")
  9. val user = mk().decodeAny<User>("user")
  10. Log.e(TAG, ": $isFirst ---- $string ---- $user" );
  11. kv.int("")
  12. }
  13. override val kv: MMKV = mk()
  14. }