-
Notifications
You must be signed in to change notification settings - Fork 3
Home
leavesCZY edited this page Dec 31, 2023
·
7 revisions
一个基于 Kotlin 语法对 MMKV 进行封装的 key-value 存储库,简化了 MMKV 的使用步骤
关联的文章:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
dependencies {
implementation("io.github.leavesczy:kvholder:latestVersion")
}
先进行初始化,指定数据的存储目录和日志级别
private fun initKVHolder(context: Context) {
KVHolder.init(
context = context,
rootDir = context.filesDir.absolutePath + "/mmkv",
logLevel = KVLogLevel.LevelWarning
)
}
然后,根据项目的实际情况来定义数据分组 keyGroup,每一类数据的存储区域各不相同,互不影响
例如,应用内所有的键值对大致可以分为两类:和用户强关联的数据 UserKVHolder、应用的配置项 PreferenceKVHolder。进行数据分组的好处就在于可以根据需要来清除特定数据。例如,当用户退登后,我们可以只清除 UserKVHolder,PreferenceKVHolder 则可以一直保留
//设置 encryptKey 以进行加密存储
//该值可以自由定义,但设置后不能再次修改,否则数据将丢失
private val UserKVHolder = MMKVKVHolder(
keyGroup = "user",
encryptKey = "encryptKey"
)
private val PreferenceKVHolder = MMKVKVHolder(
keyGroup = "preference"
)
之后,我们需要声明一个类来实现 IKVHolder 接口,在该类中定义的属性值也即要存储的键值对,key 值和属性名保持一致
除了支持基本数据类型外,也支持 Parcelable 类型和普通的 Model 类,KVHolder 内部通过 Gson 来序列化和反序列化 Model 类
object UserKV : IKVHolder by UserKVHolder {
var intValue by int(defaultValue = -1)
var longValue by long(defaultValue = -1L)
var floatValue by float(defaultValue = -1f)
var doubleValue by double(defaultValue = -1.0)
var booleanValue by boolean(defaultValue = false)
var stringValue by string(defaultValue = "")
var parcelableValue by parcelable(
clazz = ParcelizeModel::class.java,
defaultValue = ParcelizeModel(
name = "default",
age = 0
)
)
var parcelableValueNullEnabled by parcelable(clazz = ParcelizeModel::class.java)
var jsonValue by json(
clazz = JsonModel::class.java,
defaultValue = JsonModel(
name = "default",
age = 0
)
)
var jsonValueNullEnabled by json(clazz = JsonModel::class.java)
}
object PreferenceKV : IKVHolder by PreferenceKVHolder {
var parcelableValue by parcelable(
clazz = ParcelizeModel::class.java,
defaultValue = ParcelizeModel(
name = "default",
age = 0
)
)
var parcelableValueNullEnabled by parcelable(clazz = ParcelizeModel::class.java)
}
之后我们在存取键值对时,就相当于在直接读写 UserKV 的属性值,在易用性和可读性上相比 SharedPreferences 都有很大的提升,且完全屏蔽了具体的存储实现逻辑
UserKV.intValue = 1
val intValue = UserKV.intValue
UserKV.jsonValue = JsonModel(
name = "leavesCZY",
age = 35
)
val userName = UserKV.jsonValue.name
UserKV.clear()