在今天凌晨的1:14分,谷歌的安卓开发者官推发布了Jetpack DataStore的alpha版。Jetpack DataStore是一个新的数据存储解决方案,其目的是为了取代SharedPreferences。
a new and improved data storage solution aimed at replacing SharedPreferences.
Jetpack DataStore是基于Kotlin协程和Flow的,并提供两种形式实现。一种是Proto DataStore,另一种是Preferences DataStore。前者可存储类对象(typed objects),后者是存储键值对(和SharedPreferences相似)
由于我还没接触过Protocol Buffers,所以下面的初使用将不涉及Proto DataStore。有需要的去阅读参考文档。
各种数据存储方案对比
0 引用
//启用JDK8
android{
kotlinOptions {
jvmTarget = '1.8'
}
}
// Preferences DataStore
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
// Proto DataStore(确保已引用proto相关依赖)
implementation "androidx.datastore:datastore-core:1.0.0-alpha01"
1 创建DataStore
val dataStore: DataStore<Preferences> = context.createDataStore(
name = "settings"
)
name由自己自定义。当首次写入数据的时候,将会自动的创建dataStore。该文件在data/data/<包名>/files/{自己定义的name}.preferences_pb
2 设置key
private val key = preferencesKey<Int>(name = "my_counter")
- Key的类型只能是
Int, Long, Boolean, Float, String - name是键的名字
3 写数据
//取DataStore的值加一后再次存入
private suspend fun incrementCounter() {
dataStore.edit { settings ->
val currentCounterValue = settings[key] ?: 0
settings[key] = currentCounterValue + 1
}
}
btn_write.setOnClickListener {
lifecycleScope.launch(Dispatchers.IO) {
incrementCounter()
}
}
4 读数据
private val myCounterFlow: Flow<Int> =
dataStore.data.map { currentPreferences -> currentPreferences[key] ?: 0 }
btn_read.setOnClickListener {
lifecycleScope.launch(Dispatchers.IO) {
myCounterFlow.collectLatest {
withContext(Dispatchers.Main) {
Toast.makeText(this@MainActivity, "$it", Toast.LENGTH_SHORT).show()
}
}
}
}
5 从SharedPreferences合并到DataStore
private val dataStore: DataStore<Preferences> = createDataStore(
"settings",
migrations = listOf(SharedPreferencesMigration(this, "sp"))
)
传入一个migrations参数,接收一个SharedPreferencesMigration列表。
————————
简单写写,代码能跑就行。 详细看文档和源码吧