前言
DataStore是Android上轻量级存储方案。分为两种:
- Preferences DataStore:类似SharedPreferences采用键值对的方式存储数据
- 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。