DataStore详解

上文提到SharedPreferences的使用以及缺点

SharedPreferences详解_jianning-wu的博客-CSDN博客

本章节讲述DataStore的使用。

一.DataStore简介

DataStore 异步一致的事务方式存储数据,克服了 SharedPreferences 的一些缺点。

DataStore 提供了一种存储轻量数据的安全稳定的方案,例如配置文件,应用状态等。它不支持局部更新

如果任何一个成员变量被修改了,整个对象都将被序列化并持久化到磁盘。对于局部修改,请考虑使用 Room

DataStore 保证原子性一致性隔离性持久性。它是线程安全,且非阻塞的。尤其是,它解决了 SharedPreferences API 的设计缺陷。

DataStore 相比于 SharedPreferences 优点

<1> DataStore 是基于 Flow 实现的,所以保证了在主线程的安全性

<2> 以事务方式处理更新数据,事务有四大特性(原子性、一致性、 隔离性、持久性)。

<3> 可以监听操作成功或者失败结果。

DataStore 提供两种不同的实现

<1> Proto DataStore:它允许您存储类型化的对象(由协议缓冲区提供支持)。

<2> Preferences DataStore:用于存储键值对。

官网

<1> DataStore  |  Android 开发者  |  Android Developers

<2> 应用架构:数据层 - DataStore - Android 开发者  |  Android Developers

下面讲解两种不同的实现方式

二.DataStore的实现方式之 Preferences DataStore

1.Gradle依赖

implementation 'androidx.datastore:datastore-preferences:1.0.0-alpha02'

2.创建对象

val dataStore: DataStore<Preferences> = context.createDataStore(
  name = "settings"
)

3.读数据

val EXAMPLE_COUNTER = preferencesKey<Int>("example_counter")
val exampleCounterFlow: Flow<Int> = dataStore.data
  .map { preferences ->
    // No type safety.
    preferences[EXAMPLE_COUNTER] ?: 0
}

4.写数据

suspend fun incrementCounter() {
  dataStore.edit { settings ->
    val currentCounterValue = settings[EXAMPLE_COUNTER] ?: 0
    settings[EXAMPLE_COUNTER] = currentCounterValue + 1
  }
}

三.DataStore的实现方式之 Proto DataStore

1.Gradle依赖

implementation 'androidx.datastore:datastore-core:1.0.0-alpha02'

2.创建对象

object SettingsSerializer : Serializer<Settings> {
  override fun readFrom(input: InputStream): Settings {
    try {
      return Settings.parseFrom(input)
    } catch (exception: InvalidProtocolBufferException) {
      throw CorruptionException("Cannot read proto.", exception)
    }
  }

  override fun writeTo(
    t: Settings,
    output: OutputStream) = t.writeTo(output)
}

val settingsDataStore: DataStore<Settings> = context.createDataStore(
  fileName = "settings.pb",
  serializer = SettingsSerializer
)

3.读数据

val exampleCounterFlow: Flow<Int> = settingsDataStore.data
  .map { settings ->
    // The exampleCounter property is generated from the proto schema.
    settings.exampleCounter
  }

4.写数据

suspend fun incrementCounter() {
  settingsDataStore.updateData { currentSettings ->
    currentSettings.toBuilder()
      .setExampleCounter(currentSettings.exampleCounter + 1)
      .build()
    }
}

总结:鉴于目前谷歌推出的DataStore还是alpha版本。所以还不够成熟,不能用来替代SharedPreference。但是项目中使用SharedPreference时还是要注意

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值