前言
用来代替原生的 SharedPreferences,优点比较多,官网地址参考使用方法,或者查看博客Kotlin系列——封装MMKV及其相关Kotlin特性,本来使用方法就已经很简单方便了,这里再次封装处理一下,可以更方便使用。
方法列表
mk :初始化 MMKV,什么都不传得到默认值,可以传自定义 id,也可以设置是否能多进程使用encode :保存数据decode :获取保存的数据,只能识别基本数据类型decodeAny :获取保存的对象类型数据decodeList :获取保存的list类型数据int :获取 int 类型数据long :获取 long 类型数据float :获取 float 类型数据string :获取 String 类型数据double :获取 Double 类型数据bool :获取 Boolean 类型数据parcelable :获取 parcelablebytes :获取数组any :获取对象array :获取集合contain :是否包含remove :移除removes :移除多个clear :清空clearCache :清除缓存
代码
/***获取MMKV实例* @param id 单独创建实例* @param isMultiProcess 是否在多进程中使用* @return*/fun Any?.mk(id: String? = null, isMultiProcess: Boolean = false): MMKV {return if (id.isNullOrEmpty()) {MMKV.defaultMMKV()} else {if (isMultiProcess) {MMKV.mmkvWithID(id, MMKV.MULTI_PROCESS_MODE)} else {MMKV.mmkvWithID(id)}}}/***基本数据类型等常规数据的保存,使用默认的MMKV* @param pair*/fun Any?.encode(vararg pair: Pair<String, Any?>) {val mk = mk()mk.encode(*pair)}/***基本数据类型等常规数据的保存* @param pair* @return*/fun MMKV.encode(vararg pair: Pair<String, Any?>) {pair.forEach {when (val value = it.second) {null -> removeValueForKey(it.first)is Int -> encode(it.first, value)is Long -> encode(it.first, value)is CharSequence -> encode(it.first, value.toString())is String -> encode(it.first, value)is Float -> encode(it.first, value)is Double -> encode(it.first, value)is Char -> encode(it.first, value.toString())is Boolean -> encode(it.first, value)is Parcelable -> encode(it.first, value)is ByteArray -> encode(it.first, value)is Set<*> -> encode(it.first, value as Set<String>)is Array<*> -> encode(it.first, value.toJson())is Serializable -> encode(it.first, value.toJson())}}}/***获取保存的数据,只能识别基本数据类型* @param T* @param key* @return*/inline fun <reified T> Any?.decode(key: String): T? = null.decode(key)inline fun <reified T> MMKV?.decode(key: String): T? {val mk = this ?: mk()val java = T::class.javareturn when {java.isAssignableFrom(Int::class.java) -> mk.int(key) as Tjava.isAssignableFrom(Long::class.java) -> mk.long(key) as Tjava.isAssignableFrom(Float::class.java) -> mk.float(key) as Tjava.isAssignableFrom(Double::class.java) -> mk.double(key) as Tjava.isAssignableFrom(Boolean::class.java) -> mk.bool(key) as Tjava.isAssignableFrom(String::class.java) -> mk.string(key) as Telse -> {null}}}/***获取保存的对象类型数据* @param T* @param key* @return*/inline fun <reified T> Any?.decodeAny(key: String): T? = null.decodeAny(key)inline fun <reified T> MMKV?.decodeAny(key: String): T? {val mk = this ?: mk()return mk.any(key)}/***获取保存的list类型数据* @param T* @param key* @return*/inline fun <reified T> Any?.decodeList(key: String): List<T> = null.decodeList(key)inline fun <reified T> MMKV?.decodeList(key: String): List<T> {val mk = this ?: mk()return mk.list(key)}fun MMKV.int(key: String) = decodeInt(key)fun MMKV.long(key: String) = decodeLong(key)fun MMKV.float(key: String) = decodeFloat(key)fun MMKV.double(key: String) = decodeDouble(key)fun MMKV.bool(key: String) = decodeBool(key)fun MMKV.string(key: String) = decodeString(key)fun <T : Parcelable> MMKV.parcelable(key: String, clz: Class<T>) = decodeParcelable(key, clz)inline fun <reified T : Parcelable> MMKV.parcelable(key: String) =decodeParcelable(key, T::class.java)fun MMKV.bytes(key: String) = decodeBytes(key)inline fun <reified T> MMKV.any(key: String): T? = decodeString(key).toAny()inline fun <reified T> MMKV.list(key: String): List<T> = decodeString(key).toList2()fun MMKV.contain(key: String) = containsKey(key)fun MMKV.remove(key: String) = removeValueForKey(key)fun MMKV.removes(keys: Array<String>) = removeValuesForKeys(keys)fun MMKV.clear() = clearAll()fun MMKV.clearCache() = clearMemoryCache()
使用
获取 MMKV 实例
/* 初始化MMKV,第一个参数,单独创建实例;第二个参数,是否在多进程中使用* ,什么都不传获取默认的MMKV*/val mmk = mk()
保存数据,对象要序列化
//保存, 获取到MMKV后可以直接使用MMKV提供的方法//优化封装方法mmk.encode("string" to "stirng","int" to 9,"double" to 90.0,"bean" to TestBean(),"list" to listOf(1,2,3))//或者直接使用encode,直接使用默认就是什么都不传的MMKVencode("string" to "stirng","int" to 9,"double" to 90.0,"bean" to TestBean(),"list" to listOf(1,2,3))
获取基本数据类型
//获取基本数据类型val string = mmk.string("string")val i= mmk.int("int")//或使用decodeval st = decode<String>("string")val ii = decode<Int>("int")
获取对象
//获取对象val bean = mmk.any<TestBean>("bean")val bean2 = decodeAny<TestBean>("bean")
获取集合
//获取listval list = mmk.list<Int>("list")val list2 = decodeList<Int>("list")
