【发布时间】:2021-08-20 02:15:42
【问题描述】:
上下文
我有一个使用 Firestore 数据库的 Android 应用程序。在数据库中,我有一个名为 measurements 的集合。每个测量项都有一个时间戳,它表示进行测量的时间。项目无法更新。只能上传新的测量值,并且可以删除现有的测量值。我的应用程序有一个由 Room 构建的本地数据库,我正在尝试找到一种最佳方式来缓存 Firestore 中的所有内容。
到目前为止我得到了什么
获取新项目 - 为了获取新上传的测量值(由其他客户端上传),我只需获取缓存中的最新时间戳,并使用更新的时间戳查询文档。事实证明,这种解决方案不是一个好的做法,请参阅下面的问题描述。
获取已删除的项目 - 当项目被删除时,它会被移动到一个名为 deleted_measurements 的集合中。应用程序在每次启动时都会查询整个集合。如果查询结果中的某些项目也存在于缓存中,则该项目也会从缓存中删除。为了限制此集合的大小,每个项目在替换到 deleted_measurements 集合后 120 天都会被永久删除。
我的问题
导致缓存和 Firestore 不一致的场景:
- 客户端 A 创建了 2 个测量值,但目前仅上传具有较新时间戳的最新测量值。
- 客户端 B 打开应用程序,下载新添加的项目
- 客户端 A 触发上传第一个(旧)测量
- 由于上述缓存逻辑,客户端 B 不会下载第一个(较旧的)项目,因为时间戳小于 B 缓存中的最新项目。这是不一致的。
我也在考虑为项目添加一个附加属性,例如timestamp_of_upload 并以此为基础缓存,但这是我的问题:
要将新项目上传到集合中,我使用WorkManager。这是因为该应用程序经常在网络质量非常差的区域使用,并且我不希望在用户关闭应用程序时取消上传任务。这意味着我永远无法确切知道何时上传项目。我只知道上传是什么时候触发的。
任何想法,我该如何克服?
【问题讨论】:
标签: android firebase caching google-cloud-firestore nosql