google改进Android资料存储方法,推出用来代替原本SharedPreferences的Jetpack DataStore测试版,Jetpack DataStore是以Kotlin协程和Flow功能为基础,并提供了Proto DataStore和Preferences DataStore两种实例,Google提到,由于Jetpack DataStore的资料以异步、一致和交易的方式存储,克服了SharedPreferences大多数的缺点。
Proto DataStore使用Protocol Buffers(Protobufs),专门用来存储类型对象,而Preferences DataStore则可储存键值对,官方比较了SharedPreferences与这两种新存储实例的差异(下图),新的实例功能明显较多,除了具有资料交易API,能够强健地保证资料一致性之外,也能够使用Flow,更好地支持异步存储。
Google解释只有SharedPreferences才有,重新实例拿掉同步API的原因,官方提到,乍看之下,同步API可以安全地在UI线程上执行调用,但实际上线程仍可以执行磁盘I/O,而且Apply又会阻挡fsync上的UI线程,因此每当服务与活动启动或是停止时,就会触发暂停fsync调用。虽然Google在新的实例拿掉了同步API,不过在Jetpack DataStore中,Proto DataStore和Preferences DataStore却可以安全地在UI线程上调用函数。
虽然两个新实例都可以用来存储资料,但是却使用不同的存储方式,Preference DataStore更像是原本的SharedPreferences,无法定义架构,也无法确定以正确的类型访问键值,而Proto DataStore则让开发者能以Protocol Buffers定义架构,且因为Protobufs可以保留强类型资料,与XML和其他格式相比,Protobufs更小更简单,因此Google表示,虽然Proto DataStore需要开发者学习新的串行化机制,但是Proto DataStore带来强类型架构的优势。
DataStore仅适合用来存储小且简单的资料集,当需要部分更新、参照完整性或是支持大型且复杂的资料集等功能,则Google不建议使用DataStore,推荐开发者使用Room。目前DataStore仍处于Alpha测试阶段,开发者可以先查看Google提供的范例程序,同时准备迁移,开发者可以使用DataStore构建器,自动化迁移过程,但必需要注意的是,迁移程序必须在任何DataStore资料访问发生前执行。