前言

用来代替原生的 SharedPreferences,优点比较多,官网地址参考使用方法,或者查看博客Kotlin系列——封装MMKV及其相关Kotlin特性,本来使用方法就已经很简单方便了,这里再次封装处理一下,可以更方便使用。

方法列表

  1. mk :初始化 MMKV,什么都不传得到默认值,可以传自定义 id,也可以设置是否能多进程使用
  2. encode :保存数据
  3. decode :获取保存的数据,只能识别基本数据类型
  4. decodeAny :获取保存的对象类型数据
  5. decodeList :获取保存的list类型数据
  6. int :获取 int 类型数据
  7. long :获取 long 类型数据
  8. float :获取 float 类型数据
  9. string :获取 String 类型数据
  10. double :获取 Double 类型数据
  11. bool :获取 Boolean 类型数据
  12. parcelable :获取 parcelable
  13. bytes :获取数组
  14. any :获取对象
  15. array :获取集合
  16. contain :是否包含
  17. remove :移除
  18. removes :移除多个
  19. clear :清空
  20. clearCache :清除缓存

代码

  1. /**
  2. *获取MMKV实例
  3. * @param id 单独创建实例
  4. * @param isMultiProcess 是否在多进程中使用
  5. * @return
  6. */
  7. fun Any?.mk(id: String? = null, isMultiProcess: Boolean = false): MMKV {
  8. return if (id.isNullOrEmpty()) {
  9. MMKV.defaultMMKV()
  10. } else {
  11. if (isMultiProcess) {
  12. MMKV.mmkvWithID(id, MMKV.MULTI_PROCESS_MODE)
  13. } else {
  14. MMKV.mmkvWithID(id)
  15. }
  16. }
  17. }
  18. /**
  19. *基本数据类型等常规数据的保存,使用默认的MMKV
  20. * @param pair
  21. */
  22. fun Any?.encode(vararg pair: Pair<String, Any?>) {
  23. val mk = mk()
  24. mk.encode(*pair)
  25. }
  26. /**
  27. *基本数据类型等常规数据的保存
  28. * @param pair
  29. * @return
  30. */
  31. fun MMKV.encode(vararg pair: Pair<String, Any?>) {
  32. pair.forEach {
  33. when (val value = it.second) {
  34. null -> removeValueForKey(it.first)
  35. is Int -> encode(it.first, value)
  36. is Long -> encode(it.first, value)
  37. is CharSequence -> encode(it.first, value.toString())
  38. is String -> encode(it.first, value)
  39. is Float -> encode(it.first, value)
  40. is Double -> encode(it.first, value)
  41. is Char -> encode(it.first, value.toString())
  42. is Boolean -> encode(it.first, value)
  43. is Parcelable -> encode(it.first, value)
  44. is ByteArray -> encode(it.first, value)
  45. is Set<*> -> encode(it.first, value as Set<String>)
  46. is Array<*> -> encode(it.first, value.toJson())
  47. is Serializable -> encode(it.first, value.toJson())
  48. }
  49. }
  50. }
  51. /**
  52. *获取保存的数据,只能识别基本数据类型
  53. * @param T
  54. * @param key
  55. * @return
  56. */
  57. inline fun <reified T> Any?.decode(key: String): T? = null.decode(key)
  58. inline fun <reified T> MMKV?.decode(key: String): T? {
  59. val mk = this ?: mk()
  60. val java = T::class.java
  61. return when {
  62. java.isAssignableFrom(Int::class.java) -> mk.int(key) as T
  63. java.isAssignableFrom(Long::class.java) -> mk.long(key) as T
  64. java.isAssignableFrom(Float::class.java) -> mk.float(key) as T
  65. java.isAssignableFrom(Double::class.java) -> mk.double(key) as T
  66. java.isAssignableFrom(Boolean::class.java) -> mk.bool(key) as T
  67. java.isAssignableFrom(String::class.java) -> mk.string(key) as T
  68. else -> {
  69. null
  70. }
  71. }
  72. }
  73. /**
  74. *获取保存的对象类型数据
  75. * @param T
  76. * @param key
  77. * @return
  78. */
  79. inline fun <reified T> Any?.decodeAny(key: String): T? = null.decodeAny(key)
  80. inline fun <reified T> MMKV?.decodeAny(key: String): T? {
  81. val mk = this ?: mk()
  82. return mk.any(key)
  83. }
  84. /**
  85. *获取保存的list类型数据
  86. * @param T
  87. * @param key
  88. * @return
  89. */
  90. inline fun <reified T> Any?.decodeList(key: String): List<T> = null.decodeList(key)
  91. inline fun <reified T> MMKV?.decodeList(key: String): List<T> {
  92. val mk = this ?: mk()
  93. return mk.list(key)
  94. }
  95. fun MMKV.int(key: String) = decodeInt(key)
  96. fun MMKV.long(key: String) = decodeLong(key)
  97. fun MMKV.float(key: String) = decodeFloat(key)
  98. fun MMKV.double(key: String) = decodeDouble(key)
  99. fun MMKV.bool(key: String) = decodeBool(key)
  100. fun MMKV.string(key: String) = decodeString(key)
  101. fun <T : Parcelable> MMKV.parcelable(key: String, clz: Class<T>) = decodeParcelable(key, clz)
  102. inline fun <reified T : Parcelable> MMKV.parcelable(key: String) =
  103. decodeParcelable(key, T::class.java)
  104. fun MMKV.bytes(key: String) = decodeBytes(key)
  105. inline fun <reified T> MMKV.any(key: String): T? = decodeString(key).toAny()
  106. inline fun <reified T> MMKV.list(key: String): List<T> = decodeString(key).toList2()
  107. fun MMKV.contain(key: String) = containsKey(key)
  108. fun MMKV.remove(key: String) = removeValueForKey(key)
  109. fun MMKV.removes(keys: Array<String>) = removeValuesForKeys(keys)
  110. fun MMKV.clear() = clearAll()
  111. fun MMKV.clearCache() = clearMemoryCache()

使用

  • 获取 MMKV 实例

    1. /* 初始化MMKV,第一个参数,单独创建实例;第二个参数,是否在多进程中使用
    2. * ,什么都不传获取默认的MMKV*/
    3. val mmk = mk()
  • 保存数据,对象要序列化

    1. //保存, 获取到MMKV后可以直接使用MMKV提供的方法
    2. //优化封装方法
    3. mmk.encode(
    4. "string" to "stirng",
    5. "int" to 9,
    6. "double" to 90.0,
    7. "bean" to TestBean(),
    8. "list" to listOf(1,2,3)
    9. )
    10. //或者直接使用encode,直接使用默认就是什么都不传的MMKV
    11. encode(
    12. "string" to "stirng",
    13. "int" to 9,
    14. "double" to 90.0,
    15. "bean" to TestBean(),
    16. "list" to listOf(1,2,3)
    17. )
  • 获取基本数据类型

    1. //获取基本数据类型
    2. val string = mmk.string("string")
    3. val i= mmk.int("int")
    4. //或使用decode
    5. val st = decode<String>("string")
    6. val ii = decode<Int>("int")
  • 获取对象

    1. //获取对象
    2. val bean = mmk.any<TestBean>("bean")
    3. val bean2 = decodeAny<TestBean>("bean")
  • 获取集合

    1. //获取list
    2. val list = mmk.list<Int>("list")
    3. val list2 = decodeList<Int>("list")