前言
用来代替原生的 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 :获取 parcelable
bytes :获取数组
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.java
return when {
java.isAssignableFrom(Int::class.java) -> mk.int(key) as T
java.isAssignableFrom(Long::class.java) -> mk.long(key) as T
java.isAssignableFrom(Float::class.java) -> mk.float(key) as T
java.isAssignableFrom(Double::class.java) -> mk.double(key) as T
java.isAssignableFrom(Boolean::class.java) -> mk.bool(key) as T
java.isAssignableFrom(String::class.java) -> mk.string(key) as T
else -> {
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,直接使用默认就是什么都不传的MMKV
encode(
"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")
//或使用decode
val st = decode<String>("string")
val ii = decode<Int>("int")
获取对象
//获取对象
val bean = mmk.any<TestBean>("bean")
val bean2 = decodeAny<TestBean>("bean")
获取集合
//获取list
val list = mmk.list<Int>("list")
val list2 = decodeList<Int>("list")