首页 > 解决方案 > 在 Android 上使用 Firestore 的缓存策略

问题描述

语境

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

到目前为止我所拥有的

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

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

我的问题

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

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

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

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

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

标签: androidfirebasecachinggoogle-cloud-firestorenosql

解决方案


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

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


推荐阅读