Android 使用DataStore的委托方式实现数据存储
通过kotlin的委托方式来简化使用DataStore,让我们可以直接对属性进行get或set值以读取和保存数据。
第一步,需要倒入DataStore依赖:
implementation ("androidx.datastore:datastore-preferences:1.0.0")
implementation ("androidx.datastore:datastore:1.0.0")
第二步,创建一个接口,再创建一个类继承ReadWriteProperty:
interface IDataStore
class DataStoreProperty<V>(
private val decode: (String) -> V,
private val encode: Pair<String, V>.() -> Unit,
var key: String? = null
) : ReadWriteProperty<IDataStore, V> {
override fun getValue(thisRef: IDataStore, property: KProperty<*>): V =
decode(key ?: property.name)
override fun setValue(thisRef: IDataStore, property: KProperty<*>, value: V) {
encode((key ?: property.name) to value)
}
}
第三步,我们创建一个公用的getDs和setDs用于读取和保存DataStore数据:
inline fun <reified T> IDataStore.getDs(
crossinline decode: () -> Preferences.Key<T>,
default: T
): T {
var value: T? = null
runBlocking {
App.mContext.dataStore.data.first {
value = it[decode()] ?: default
true
}
}
return value ?: default
}
fun IDataStore.setDs(encode: (setting: MutablePreferences) -> Unit) {
runBlocking {
App.mContext.dataStore.edit {
encode(it)
}
}
}
第四步,创建基本类型的扩展方法:
fun IDataStore.dsInt(default: Int = 0) =
DataStoreProperty(
{ getDs({ intPreferencesKey(it) }, default) },
{ setDs { it[intPreferencesKey(first)] = second } })
fun IDataStore.dsLong(default: Long = 0L) =
DataStoreProperty(
{ getDs({ longPreferencesKey(it) }, default) },
{ setDs { it[longPreferencesKey(first)] = second } })
fun IDataStore.dsBool(default: Boolean = false) =
DataStoreProperty(
{ getDs({ booleanPreferencesKey(it) }, default) },
{ setDs { it[booleanPreferencesKey(first)] = second } })
fun IDataStore.dsFloat(default: Float = 0f) =
DataStoreProperty(
{ getDs({ floatPreferencesKey(it) }, default) },
{ setDs { it[floatPreferencesKey(first)] = second } })
fun IDataStore.dsDouble(default: Double = 0.0) =
DataStoreProperty(
{ getDs({ doublePreferencesKey(it) }, default) },
{ setDs { it[doublePreferencesKey(first)] = second } })
fun IDataStore.dsString(default: String = "") =
DataStoreProperty(
{ getDs({ stringPreferencesKey(it) }, default) },
{ setDs { it[stringPreferencesKey(first)] = second } })
fun IDataStore.dsStringSet(default: Set<String> = setOf()) =
DataStoreProperty(
{ getDs({ stringSetPreferencesKey(it) }, default) },
{ setDs { it[stringSetPreferencesKey(first)] = second } })
最后,就是如何使用了,简单的列举了一个方法如下:
//创建一个类继承 IDataStore
object DS : IDataStore {
var isPrivate by dsBool(false)
}
//在需要获取值的地方调用
DS.isPrivate
//保存数据的话可以直接赋值即可
DS.isPrivate = true
还有一些保存和读取Parcelable的数据就不列举了
一起学习天天向上