Jetpack的DataStore数据存储组件的使用简介
介绍
Jetpack DataStore
是一种数据存储解决方案,可让您使用Protocol Buffer
(协议缓冲区)存储键值对或类型化对象。DataStore使用Kotlin协程
和Flow
异步,一致的事务方式来存储数据。
注意: 如果需要支持大型或复杂的数据集,部分更新或参考完整性,请考虑使用
Room
而不是DataStore。DataStore非常适合小型,简单的数据集,并且不支持部分更新或参照完整性。
目的
Jetpack DataStore
是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences
。以异步、一致的事务方式存储数据,克服了 SharedPreferences
的大部分缺点。
DataStore实现方式
DataStore 基于 Kotlin 协程和流程构建而成,提供两种不同的实现,分别如下:
- Preferences DataStore方式
使用键存储和访问数据。此实现不需要预定义的架构,并且不提供类型安全性。
- Proto DataStore方式
将数据存储为自定义数据类型的实例。此实现要求您使用协议缓冲区定义架构,但它提供类型安全性。
SharedPreferences 与 DataStore 支持功能的对比
特征 | SharedPreferences | PreferencesDataStore | ProtoDataStore |
---|---|---|---|
是否支持异步 | 是 | 是 | 是 |
是否支持同步 | 是 | 否 | 否 |
是否支持在UI线程调用 | 否 | 是 | 是 |
可以发出错误信号 | 否 | 是 | 是 |
避免运行时异常 | 否 | 是 | 是 |
类型安全 | 否 | 否 | 是 |
一致的事务方式存储数据 | 否 | 是 | 是 |
.
.
DataStore 的简单使用
DataStore的使用就是: Preferences DataStore 的使用 和 Proto DataStore 的使用
PreferencesDataStore 的使用
在 build.gradle
文件添加 DataStore 的依赖
dependencies {
// Preferences DataStore
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha04"
}
.
PreferencesDataStore 的使用步骤如下:
1. 创建Preferences DataStore
//定义 DataStore 的名字
private val MY_DATA_STORE_NAME = "DataStorePreference"
//创建DataStore对象
val dataStore: DataStore<Preferences> = context.createDataStore(
name = DATASTORE_PREFERENCE_NAME
)
注:
name
属性必须要设置,不然无法使用DataStore
。
2. 插入数据
private suspend fun saveData(value: String) {
//创建key
var preKey = preferencesKey<String>(PREFERENCE_KEY_NAME)
//插入数据
dataStore.edit {
mutablePreferences ->
mutablePreferences[preKey] = value
}
}
PreferencesDataStore
中是通过DataStore.edit()
写入数据,edit
方法是个suspend
函数,必须在协程中进行调用;
3. 根据key来读取数据
private suspend fun readDara(): String {
//创建key
var preKey