Google 致力于为黑人社区推动种族平等。查看具体举措

DataStore

以异步、一致的事务方式存储数据,克服了 SharedPreferences 的一些缺点
最近更新时间 当前稳定版 下一候选版本 Beta 版 Alpha 版
2021 年 3 月 10 日 - - - 1.0.0-alpha08

声明依赖项

如需添加 DataStore 的依赖项,您必须将 Google Maven 代码库添加到项目中。如需了解详情,请参阅 Google 的 Maven 代码库

DataStore 有两种实现方式:Preferences 和 Proto,从中选择其一即可。您还可以向任一实现方式添加与 Android 无关的依赖项。

在应用或模块的 build.gradle 文件中添加所需实现方式的依赖项:

类型化

// Typed DataStore (Typed API surface, such as Proto)
dependencies {
  implementation "androidx.datastore:datastore:1.0.0-alpha07"

  // optional - RxJava2 support
  implementation "androidx.datastore:datastore-rxjava2:1.0.0-alpha07"

  // optional - RxJava3 support
  implementation "androidx.datastore:datastore-rxjava3:1.0.0-alpha07"
}
// Alternatively - use the following artifact without an Android dependency.
dependencies {
  implementation "androidx.datastore:datastore-core:1.0.0-alpha07"
}

偏好设置

// Preferences DataStore (SharedPreferences like APIs)
dependencies {
  implementation "androidx.datastore:datastore-preferences:1.0.0-alpha07"

  // optional - RxJava2 support
  implementation "androidx.datastore:datastore-preferences-rxjava2:1.0.0-alpha07"

  // optional - RxJava3 support
  implementation "androidx.datastore:datastore-preferences-rxjava3:1.0.0-alpha07"
}
// Alternatively - use the following artifact without an Android dependency.
dependencies {
  implementation "androidx.datastore:datastore-preferences-core:1.0.0-alpha07"
}

反馈

您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对库的改进有某些建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。

创建新问题

如需了解详情,请参阅问题跟踪器文档

版本 1.0.0

版本 1.0.0-alpha08

2021 年 3 月 10 日

发布了 androidx.datastore:datastore-*:1.0.0-alpha08版本 1.0.0-alpha08 中包含这些提交内容

API 变更

  • 您现在可以将依赖于上下文的迁移添加到您的 dataStorepreferencesDataStore 属性委托。(I4ef69b/173726702
  • 如果您不再使用数据存储区委托或 context.createDataStore,请添加辅助函数以获取文件的名称 (I60f9a)
  • 序列化器 writeTo 和 readFrom 现在处于挂起状态如果您已实现序列化器,则需要将函数更新为挂起函数。(I1e58e)
  • 为 RxDataStore 用户添加了属性委托。(Ied768b/173726702

问题修复

版本 1.0.0-alpha07

2021 年 2 月 24 日

发布了 androidx.datastore:datastore-*:1.0.0-alpha07版本 1.0.0-alpha07 中包含这些提交内容

API 变更

  • 已将 Context.createDataStore 扩展函数移除,并替换为 globalDataStore 属性委托。在您的 kotlin 文件的顶层调用 globalDataStore 一次。例如:

    val Context.myDataStore by dataStore(...)
    

    请将它放在您的 kotlin 文件的顶层,以便 globalDataStore 只有一个实例。(I57215b/173726702

  • RxDataStore 函数现在位于 RxDataStore 类中,而不是 DataStore 上的扩展函数中。(Idccdbb/177691248

  • 如果您想要将 EncryptedSharedPreferences(或直接启动 SharedPreferences)迁移到 DataStore,现在可以通过新的 SharedPreferencesMigration 构造函数来实现该目的,此构造函数支持您注入 SharedPreferences。(I8e04eb/177278510

问题修复

  • 现在,如果同一文件有多个有效的 DataStore,DataStore 将会抛出异常。如果您没有将 DataStore 作为单例进行管理,或者未能确保同一文件不会同时有两个有效的 DataStore 实例,那么现在您在从 DataStore 中读取或向其中写入内容时可能会看到异常。通过将 DataStore 作为单例进行管理,便可解决这些问题。(Ib43f4b/177691248
  • 修正了取消调用方作用域时的取消行为。(I2c7b3)

版本 1.0.0-alpha06

2021 年 1 月 13 日

发布了 androidx.datastore:datastore-*:1.0.0-alpha06版本 1.0.0-alpha06 中包含这些提交内容

新功能

  • 为 DataStore 添加了 RxJava 封装容器。datastore-rxjava2/3 工件包含核心 DataStore API(RxDataStoreRxDataStoreBuilderRxDataMigration)的封装容器。datastore-preferences-rxjava2/3 工件包含一个用于构建 Preferences DataStore 的构建器。

API 变更

  • 隐藏 CorruptionHandler 接口。不需要公开此接口是因为 DataStore 工厂仅接受 ReplaceFileCorruptionHandler。(I0b3b3b/176032264)
  • 已将 preferencesKey<T>(name: String): Key<T> 方法移除,并替换为每种受支持类型专用的方法,例如 preferencesKey<Int>("int") 现在是 intPreferencesKey("int")Ibcfacb/170311106

问题修复

  • 修复了关于 DataStoreFactory 的文档,该文档之前未提到 datastore 文件是在“datastore/”子目录中创建的。(Ica222)

版本 1.0.0-alpha05

2020 年 12 月 2 日

发布了 androidx.datastore:datastore-*:1.0.0-alpha05版本 1.0.0-alpha05 中包含这些提交内容。

问题修复

  • 针对数据存储区中的并发写入添加了更好的文档和异常。(Ia98a2b/173522155b/173726702
  • 现在,我们允许(但不强求)关闭传递给 Serializer.writeTo() 的 OutputStream。(I5c9bfb/173037611

版本 1.0.0-alpha04

2020 年 11 月 17 日

发布了 androidx.datastore:datastore-*:1.0.0-alpha04版本 1.0.0-alpha04 中包含这些提交内容

问题修复

  • 修复了在 Preference Datastore 1.0.0-alpha03 中引发以下崩溃的打包问题:java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/datastore/preferences

版本 1.0.0-alpha03

2020 年 11 月 11 日

发布了 androidx.datastore:datastore-*:1.0.0-alpha03版本 1.0.0-alpha03 中包含这些提交内容

新功能

  • Preferences 现在支持双精度值(如果您需要比浮点数更高的精度,这一点非常有用)(I5be8fb/169471808

API 变更

  • 为数据存储区创建了纯 Kotlin 依赖项,以加快编译速度。androidx.datastore:datastore-core 包含仅适用于 Kotlin 的核心 API,androidx.datastore:datastore 包含依赖 Android 的 API(包括 SharedPreferencesMigrationContext.createDataStore 构造函数。)(I42d75b/168512698
  • 拆分 Preferences DataStore 的目标,以加快 Kotlin 编译速度 (Ia3c19)
  • 序列化器现在需要将新的属性作为默认值,系统会在磁盘上没有任何数据时使用该值。这样可以更轻松地实现自定义序列化器,用户不必将空输入流作为特例处理(对于空输入流,无法使用 json 进行解析)。

    • 此外,现在还会进行一项检查,以确认提供给 writeTo() 的输出流未关闭,以及关闭时是否会抛出异常 (I16e29)
  • 将 SharedPreferencesView 的构造函数变为内部构造函数。为了进行测试,该构造函数最初处于公开状态。测试应改为构造一个 SharedPreferencesMigration,然后对其进行测试。(I93891)

问题修复

  • DataStoreFactoryPreferenceDataStoreFactory 上的 produceFile 参数现在是列表中的最后一个参数,因此您可以使用 Kotlin 尾随 lambda 语法。(Ibe7f1b/169425442
  • 遵循明确的 API 新要求(适用于 Kotlin)(I5ae1e)

已知问题

  • Preference Datastore 会崩溃,并显示 java.lang.NoClassDefFoundError。(b/173036843)

版本 1.0.0-alpha02

2020 年 10 月 14 日

发布了 androidx.datastore:datastore-core:1.0.0-alpha02androidx.datastore:datastore-preferences:1.0.0-alpha02版本 1.0.0-alpha02 中包含这些提交内容

问题修复

  • 在 datastore-core 中添加了突变防护措施。对于将数据存储区用于非 proto/非偏好类型的用户而言,突变会破坏数据存储区的使用 (I6aa84)
  • 向 Preferences.kt 添加了 toString 方法,使当前状态易于调试 (I96006)
  • 添加了防止滥用 DataStore.Preferences 的异常事件 (I1134d)
  • 修复了导致应用在启动时崩溃的问题(I69237b/168580258

版本 1.0.0-alpha01

2020 年 9 月 2 日

发布了 androidx.datastore:datastore-core:1.0.0-alpha01androidx.datastore:datastore-preferences:1.0.0-alpha01版本 1.0.0-alpha01 中包含这些提交内容

新功能

Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences。DataStore 基于 Kotlin 协程和流程构建而成,提供两种不同的实现:

  • Proto DataStore,它允许您存储类型化的对象(由协议缓冲区提供支持)
  • Preferences DataStore,用于存储键值对

以异步、一致的事务方式存储数据,克服了 SharedPreferences 的大部分缺点。