[Android]使用 Jetpack DataStore 进行数据存储

Jetpack DataStore是Android开发中用于数据存储的新解决方案,它替代SharedPreferences,基于Kotlin协程和Flow。DataStore提供Proto和Preferences两种实现,前者用于存储类型化的对象,后者用于键值对。DataStore的优势在于其异步、一致性和事务性,解决了SharedPreferences的同步API潜在的UI阻塞问题。同时,DataStore提供了更好的错误处理和数据一致性保证。开发者可以通过Proto DataStore利用Protocol Buffers实现强类型数据。要使用DataStore,需要添加依赖并定义数据序列化。对于偏好迁移,DataStore提供了自动迁移功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎使用 Jetpack DataStore,这是一个经过改进的全新数据存储解决方案,旨在替代原有的 SharedPreferences。Jetpack DataStore 基于 Kotlin 协程和 Flow 开发,并提供两种不同的实现: Proto DataStore 和 Preferences DataStore。其中 Proto DataStore,可以存储带有类型的对象 (使用 protocol buffers 实现);Preferences DataStore,可以存储键值对。在 DataStore 中,数据以异步的、一致的、事务性的方式进行存储,克服了 SharedPreferences 的大部分缺点。

protocol buffers

https://developers.google.cn/protocol-buffers

SharedPreferences 和 DataStore 对比

图片

  • SharedPreferences 有一个看上去可以在 UI 线程安全调用的同步 API,但是该 API 实际上执行了磁盘 I/O 操作。此外,apply() 方法会在 fsync() 阻塞 UI 线程。在您应用的任何地方,每当 Service 或 Activity 启动或停止时,就会触发等待 fsync() 的调用。由 apply() 安排的 fsync() 调用过程会阻塞 UI 线程,这也常常成为造成 ANR 的源头。

** SharedPreferences 在分析出错时会抛出运行时异常。

ANR
https://developer.android.google.cn/topic/performance/vitals/anr

在两种实现中,除非另外特指,否则 DataStore 会将首选项存储在文件中,并且所有的数据操作都会在 Dispatchers.IO 上执行。

虽然 Preferences DataStore 与 Proto DataStore 都可以存储数据,但它们的实现方法不尽相同:

Preference DataStore,就像 SharedPreferences 一样,不能定义 schema 或保证以正确的类型访问键值。

Proto DataStore 让您可以使用 Protocol buffers 定义 schema。使用 Protobufs 可以保留强类型数据。它们相对于 XML 或其他相似的数据格式要更快、更小、歧义更少。虽然 Proto DataStore 要求您学习一种新的序列化机制,但考虑到 Proto DataStore 所带来的强类型 schema 的优势,我们认为这样的代价是值得的。

Protocol buffers
https://developers.google.cn/protocol-buffers

Room 和 DataStore 对比

如果您有局部更新数据、参照完整性或支持大型、复杂数据集的需

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值