【问题标题】:What's the proper way to add/update data in Firestore when offline?离线时在 Firestore 中添加/更新数据的正确方法是什么?
【发布时间】:2018-08-03 06:25:53
【问题描述】:

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

我目前正在进行如下保存:

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 中添加/更新数据的正确方法是什么,以使应用的内存不会无限增长和变慢?

【问题讨论】:

    标签: android google-cloud-firestore


    【解决方案1】:

    Cloud Firestore 使用SQLite 作为其持久性机制。因此,对于间歇性的离线活动,您应该不会遇到性能或耐用性问题。

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

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

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

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

    【讨论】:

    • “还有一件事,如果你有很多离线客户端试图写入同一个文档,当状态改变时,只有最后一个客户端会真正写入服务器。”这有点过于简单化了。所有写入都将发送到服务器。如果您不在安全规则中防止覆盖,则只有最后一个将是永久的(嗯,直到其他人再次覆盖它)。但这也适用于所有客户端都在线时。
    • @FrankvanPuffelen 我指的是LWW 概念(最后写入获胜)。因此,如果有许多离线用户尝试写入同一个文档,只有最后一个上线的用户才会真正“获胜”并坚持他们的更改。谢谢你Puf的解释!
    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 2020-03-08
    • 2023-04-07
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多