android - 离线时在 Firestore 中添加/更新数据的正确方法是什么?

标签 android google-cloud-firestore

当我的应用处于离线状态并且我正在添加或更新文档时,内存会增加。此外,显示文档列表需要更长的加载时间。如果我在设备在线时运行相同的代码,内存将保持一致,并且具有文档列表的 Activity 的速度也会保持一致。

我目前正在做如下保存:

collectionRef.document(id).set(obj, SetOptions.merge());

或者批处理几条记录:

batch.set(docRef1, obj1);
batch.set(docRef2, obj2);
batch.commit();

我有 onComplete 的监听器,但在 this question 的接受答案中,这似乎表明在大多数情况下监听器是不必要的,并且您不能在离线时等待它完成。

在另一个问题中,他们在代码中指出需要“快照”才能正确进行在线和离线保存:Offline issue with Firestore vs Firebase .但我找不到其他任何地方表明这是否会有所作为。我认为快照是您附加到文档或查询的东西,当您希望收到有关更改的通知时,如果不删除它,附加这样的监听器将导致内存泄漏。

所有这一切的另一部分是这种缓慢可能会如何影响数据完整性。当我在 Android Studio 的分析器中观察时,我发现 FirestoreWorker 可以达到它持续工作的程度,即使我没有在应用程序中执行任何操作也是如此。我不只是说几秒钟,更像是一分钟。我可以找到离线时没有任何写入顺序保证。尝试停止并重新启动应用程序似乎对速度缓慢没有任何影响(尽管它会重置内存)。

所以所有这些都引出了一个问题:离线时在 Firestore 中添加/更新数据的正确方法是什么,这样应用的内存就不会无限制地增长并变慢?

最佳答案

Cloud Firestore 使用 SQLite 作为其持久性机制。因此,对于断断续续的离线 Activity ,您应该不会遇到性能或耐用性方面的问题。

但是,如果您打算长期使用 Firestore 数据库,则应注意一些事项。 Cloud Firestore 不是作为离线数据库构建的,它是一个在线数据库,当您离线较长 时间段时,它会继续工作。离线时,尚未同步到服务器的挂起写入将保留在队列中。如果您在没有联机同步它们的情况下执行过多的写入操作,该队列将快速增长并且它不仅会减慢 write 操作,还会减慢您的 read操作。

所以我建议使用这个数据库的在线功能。正如我引用的一位 Firebase 工程师所说,“在 Firestore 中构建慢速查询是不可能的”。因此,性能来自后端的新索引功能,而这些优化在您离线时不存在。

还有一件事,如果您有许多离线客户端试图写入同一个文档,当状态更改时,只有最后一个客户端会实际写入服务器。

因此,为了回答您的问题,离线时没有适当的方法在 Firestore 中添加/更新数据以减少内存使用。只需上网即可!

关于android - 离线时在 Firestore 中添加/更新数据的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48943754/

相关文章:

android - 如何在 Android Studio 的 Logcat 选项卡中增加过滤器输入的大小

android - 无法解析符号 AsyncHttpClient

android - 找到两个 View 之间的交集?

firebase - Firestore 集合组查询解决方案?

javascript - 如何使用 firestore 执行动态 where 查询并添加索引

java - 存储 arraylist sharedpreferences android

android - 旋转手机在 Android 上重新启动视频

javascript - 如何在 Cloud Function 中循环 Firestore 数组值

javascript - Firebase 9 从嵌套集合中获取单个文档 - React

flutter - SetOptions 在 Firestore Flutter WEB 中不起作用