DataStore使用

621 阅读1分钟

前言

DataStore是Android上轻量级存储方案。分为两种:

  1. Preferences DataStore:类似SharedPreferences采用键值对的方式存储数据
  2. Proto DataStore:将数据作为自定义数据类型的实例进行存储

Preferences DataStore

官方建议替代SharedPreferences(会导致卡顿、ANR问题)。基于Key-Value结构存储,只能存储基本类型,如:Int、String、Long等。

引入依赖:

implementation("androidx.datastore:datastore-preferences:1.0.0")

/**
 * 声明dataStore对象
 */
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "StoreName")

/**
 * 挂起函数:根据key存储value
 * context:上下文
 * keyName:键
 * value:值
 */
suspend fun saveIntValue(context: Context, keyName: String, value: Int) {
    val key = intPreferencesKey(keyName)
    context.dataStore.edit {
        it[key] = value
    }
}

/**
 * 挂起函数:根据key获取value
 * context:上下文
 * keyName:键
 * defaultValue:默认值
 */
suspend fun getIntValue(context: Context, keyName: String, defaultValue: Int? = null): Int {
    val key = intPreferencesKey(keyName)
    return context.dataStore.data.map {
        it[key] ?: (defaultValue ?: 0)
    }.first()
}
fun test(){
    lifecycleScope.launch {
        saveIntValue(this@MainActivity,"testInt",100)
        val result = getIntValue(this@MainActivity,"testInt",0)
        Log.d(TAG,"result:$result")
    }
}
输出:result:100

Proto DataStore

Preferences DataStore 对于引用类型的数据结构不能直接存储,通常可以通过对象转Json字符串以String存储,而序列化和反序列化有一定的性能损耗。

Proto DataStore像操作类的成员变量一样操作DataStore。