【问题标题】:Caching strategy using Firestore on Android在 Android 上使用 Firestore 的缓存策略
【发布时间】:2021-08-20 02:15:42
【问题描述】:

上下文

我有一个使用 Firestore 数据库的 Android 应用程序。在数据库中,我有一个名为 measurements 的集合。每个测量项都有一个时间戳,它表示进行测量的时间。项目无法更新。只能上传新的测量值,并且可以删除现有的测量值。我的应用程序有一个由 Room 构建的本地数据库,我正在尝试找到一种最佳方式来缓存 Firestore 中的所有内容。

到目前为止我得到了什么

获取新项目 - 为了获取新上传的测量值(由其他客户端上传),我只需获取缓存中的最新时间戳,并使用更新的时间戳查询文档。事实证明,这种解决方案不是一个好的做法,请参阅下面的问题描述。

获取已删除的项目 - 当项目被删除时,它会被移动到一个名为 deleted_measurements 的集合中。应用程序在每次启动时都会查询整个集合。如果查询结果中的某些项目也存在于缓存中,则该项目也会从缓存中删除。为了限制此集合的大小,每个项目在替换到 deleted_measurements 集合后 120 天都会被永久删除。

我的问题

导致缓存和 Firestore 不一致的场景:

  1. 客户端 A 创建了 2 个测量值,但目前仅上传具有较新时间戳的最新测量值。
  2. 客户端 B 打开应用程序,下载新添加的项目
  3. 客户端 A 触发上传第一个(旧)测量
  4. 由于上述缓存逻辑,客户端 B 不会下载第一个(较旧的)项目,因为时间戳小于 B 缓存中的最新项目。这是不一致的。

我也在考虑为项目添加一个附加属性,例如timestamp_of_upload 并以此为基础缓存,但这是我的问题:

要将新项目上传到集合中,我使用WorkManager。这是因为该应用程序经常在网络质量非常差的区域使用,并且我不希望在用户关闭应用程序时取消上传任务。这意味着我永远无法确切知道何时上传项目。我只知道上传是什么时候触发的。

任何想法,我该如何克服?

【问题讨论】:

标签: android firebase caching google-cloud-firestore nosql


【解决方案1】:

你有一个非常有趣的方法。我不确定你是否知道,但我认为this 文章对你来说会很有趣。

你不能为firestore启用离线功能以避免使用WorkManager吗?在我的原生应用程序中,firestore 数据库在网络连接不良甚至丢失时非常可靠。

【讨论】:

  • 您好,感谢您的文章,我会尽快阅读。您认为我的方法在哪些方面有趣?你是对的,我只能在没有 WorkManager 的情况下使用 firestore SDK 进行上传。但是我不确定当应用程序被杀死时它是如何工作的。不幸的是,我不会更进一步,因为在这种情况下我也不知道成功上传的时间戳。
  • 我发现只获取有变化的数据的方法很有趣,因为它可以大量减少读取量。我认为 Firestore 的 android SDK 可以处理 App Kills 甚至重启设备(不仅仅是应用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2010-10-06
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2013-04-08
相关资源
最近更新 更多