【问题标题】:Android Preferences DataStore vs Existing Room ImplementationAndroid Preferences DataStore 与现有 Room 实现
【发布时间】:2021-02-17 16:30:30
【问题描述】:

我是 Android 开发新手,我即将为我的应用实现简单的首选项。看起来 SharedPreferences 是一条死胡同并且有很多缺点,所以我正在研究 DataStore(非 Proto)与 Room。 由于我已经在我的应用程序中大量使用 Room 和 LiveData(是的,我知道 Flow 是新的热点)来处理其他事情,使用 DataStore 也有什么好处吗?我知道 Room 推荐用于大型或复杂的数据,因为我已经查看了以下内容,但我希望经验更丰富的开发人员可以进一步为我提供帮助:

https://android-developers.googleblog.com/2020/09/prefer-storing-data-with-jetpack.html

https://proandroiddev.com/lets-explore-jetpack-datastore-in-android-621f3564b57

https://medium.com/better-programming/jetpack-datastore-improved-data-storage-system-adec129b6e48

谢谢。

【问题讨论】:

  • 您为什么要考虑使用关系数据库来满足用户偏好?
  • “SharedPreferences 是一条死胡同并且有很多缺点”的来源?
  • @ianhanniballake 因为我已经有了一个,我可以快速添加一个更简单的表来存储这些东西而不是数据存储库?我不知道这是否是正确的答案,但这是我目前的思路。
  • @squirrel,查看我发布的第一个网址:* SharedPreferences has a synchronous API that can appear safe to call on the UI thread, but which actually does disk I/O operations. Furthermore, apply() blocks the UI thread on fsync(). Pending fsync() calls are triggered every time any service starts or stops, and every time an activity starts or stops anywhere in your application. The UI thread is blocked on pending fsync() calls scheduled by apply(), often becoming a source of ANRs. ** SharedPreferences throws parsing errors as runtime exceptions.
  • @Bink 对fsync() 的一个有趣的观察,但我不确定有什么替代方案。由于该应用程序可能会在onStop() 之后立即被杀死,因此您必须确保完成写入。万一数据还没有进入磁盘,ANR 不是比丢失它更可取吗?此外,运行时异常的替代方法是检查异常;不知道这些会更好

标签: android android-room android-preferences datastore


【解决方案1】:

official blog post you linked 有一个专门介绍 Room 与 DataStore 的部分:

如果您需要部分更新、参照完整性或对大型/复杂数据集的支持,您应该考虑使用 Room 而不是 DataStore。 DataStore 非常适合小型、简单的数据集,不支持部分更新或引用完整性。

用户偏好几乎总是属于“小而简单的数据集”,这些数据集可以轻松地表示为不需要表架构开销的键/值对(或者如果您想使用 Proto DataStore,则可以使用更复杂的东西) 、SQL 查询、自定义解析或关系数据库的“关系”部分。

【讨论】:

  • 我知道帖子中的内容。我读到它说不要使用 Room,除非你有特定的理由这样做。我不清楚的是,如果我已经将 Room 用于其他用途,我应该利用它吗?因为我已经在我的应用程序中使用 Room,所以不为 DataStore 添加所有库是否有意义?
  • 仅仅因为你有一把锤子并不能使所有问题都成为钉子。为工作选择合适的工具是一项重要的技能。
  • 明白。所以,如果我理解正确,你说添加第二个“DataStore”技术来处理几十个键值对更有意义,即使我已经有一个数据存储(Room)可以毫无问题地处理这个问题?
  • 您应该使用正确的工具来完成这项工作。如果您查看“SQL 与 NoSQL”,您会看到关于不强制一个系统进入另一个系统的相同讨论。
  • @iloo 我只是在使用 Room。在这个时候,我不后悔我的选择,因为我在这方面的需求很简单。也就是说,ianhanniballake 是这里的权威。我还没有接受他的回答的唯一原因是我想先听听另一位经验丰富的开发人员的意见。
猜你喜欢
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 2017-10-23
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多