Skip to content
leavesCZY edited this page Dec 31, 2023 · 7 revisions

一、KVHolder

一个基于 Kotlin 语法对 MMKV 进行封装的 key-value 存储库,简化了 MMKV 的使用步骤

关联的文章:

二、导入依赖

Maven Central

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()
Clone this wiki locally