针对 mmkv 简单使用封装。实际使用中发现对序列化对象不太有用。还有个问题就是在使用时,不同的类如果属性名一样,其实相当于是用的同一个(其实就是使用的是同一个 key 值),这种写法虽然省去了写 key 值,但是有几个缺点,一是属性名一样相当于 key 一样,所以用到同一个对象时就要记住这个属性名。二是对于在不同的类,有时名称不可避免会一样,但是又不是用的同一个对象,这时就必须要起一个不一样的属性名。
让一个类实现 MMKVOwner 接口,即可通过 by mmkvXXXX() 方法将属性委托给 MMKV,例如:
object DataRepository : MMKVOwner {
var isFirstLaunch by mmkvBool(default = true)
var user by mmkvParcelable<User>()
}
设置或获取属性的值则调用对应的 encode 或 decode 方法,key 值为属性名。
支持以下类型:
方法 | 默认值 |
---|---|
mmkvInt() | 0 |
mmkvLong() | 0L |
mmkvBool() | false |
mmkvFloat() | 0f |
mmkvDouble() | 0.0 |
mmkvString() | / |
mmkvStringSet() | / |
mmkvBytes() | / |
mmkvParcelable() | / |
在 MMKVOwner 的实现类可以获取 kv 对象进行删除值或清理缓存等操作:
kv.removeValueForKey(::isFirstLaunch.name)
kv.clearAll()
如果不同业务需要区别存储,可以重写 kv 属性来创建不同的 MMKV 实例:
object DataRepository : MMKVOwner {
override val kv: MMKV = MMKV.mmkvWithID("MyID")
}
MMKV-KTX 和 MK 封装混合使用示例
对于简单的基本数据类型,可以使用 MMKV-KTX,比较方便,不用设置 key,值设置了就保存了。只要类实现MMKVOwner接口即可使用,如果想使用 mk 封装,可以直接使用 kv,就是 MMKV 对象,直接使用 MK 封装的扩展函数。同时提供了重新方法修改 MMKV。当然如果想直接使用 MK 封装,直接调用 mk() 即可初始 MMKV 对象。
class TestMK: MMKVOwner {
var isFirst by mmkvBool(false)
fun setValue(){
isFirst = true
mk().encode("user" to User("alice",11))
}
fun getValue(){
val string = mk().string("user")
val user = mk().decodeAny<User>("user")
Log.e(TAG, ": $isFirst ---- $string ---- $user" );
kv.int("")
}
override val kv: MMKV = mk()
}