在 Android 上使用 Firestore 的缓存策略

Posted

技术标签:

【中文标题】在 Android 上使用 Firestore 的缓存策略【英文标题】:Caching strategy using Firestore on Android 【发布时间】: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。这是因为该应用程序经常在网络质量非常差的区域使用,并且我不希望在用户关闭应用程序时取消上传任务。这意味着我永远无法确切知道何时上传项目。我只知道上传是什么时候触发的。

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

【问题讨论】:

我认为这篇文章How to drastically reduce the number of reads when no documents are changed in Firestore? 可能会有所帮助。 【参考方案1】:

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

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

【讨论】:

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

以上是关于在 Android 上使用 Firestore 的缓存策略的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebase 云功能和 Firestore 在 android 上验证购买 [关闭]

无法在 Android 上使用 Cloud Firestore 保存文档

Firebase Firestore:无法访问Firestore后端(仅限Android)

Android 中的 Firestore 权限在测试规则上被拒绝

如何使用 Android 对 Firestore 进行分页?

如何在 Android 的 RecyclerView 中显示来自 Firestore 的数据?