tom*_*nsn 4 android google-cloud-firestore
当我的应用程序离线并且我正在添加或更新文档时,内存会增加。此外,显示文档列表需要更长的时间来加载。如果我在设备在线时运行相同的代码,内存将保持一致以及具有文档列表的活动的速度。
我目前正在做如下保存:
collectionRef.document(id).set(obj, SetOptions.merge());
Run Code Online (Sandbox Code Playgroud)
或者批处理几个记录:
batch.set(docRef1, obj1);
batch.set(docRef2, obj2);
batch.commit();
Run Code Online (Sandbox Code Playgroud)
我有 onComplete 的听众,但在这个问题的公认答案中,似乎表明在大多数情况下听众是不必要的,而且当您离线时,无论如何您都无法等待它完成。
在另一个问题中,他们在代码中指出正确执行在线和离线保存需要“快照”:Firestore 与 Firebase 的离线问题。但我找不到其他任何地方表明这是否会有所作为。我认为快照是当您希望收到更改通知时附加到文档或查询的东西,并且附加这样的侦听器如果不删除它会导致内存泄漏。
所有这一切的另一部分是这种缓慢可能如何影响数据完整性。当我在 Android Studio 的分析器中观看时,我看到 FirestoreWorker 可以达到持续工作的程度,即使我没有在应用程序中执行任何操作。我说的不只是几秒钟,更像是一分钟。当我可以找到离线时,没有任何写入顺序保证。尝试停止并重新启动应用程序似乎对缓慢没有任何影响(尽管它会重置内存)。
所以所有这些都引出了一个问题:离线时在 Firestore 中添加/更新数据的正确方法是什么,以便应用程序的内存不会无限增长并减慢速度?
Cloud Firestore 使用 SQLite用于其持久性机制。因此,对于断断续续的离线活动,您应该不会遇到性能或持久性问题。
但是,如果您打算长时间使用 Firestore 数据库,则应注意一些事项。Cloud Firestore 不是作为离线数据库构建的,而是一个在线数据库,可以在您离线一段时间short或longer一段时间后继续工作。离线时,尚未同步到服务器的挂起写入将保留在队列中。如果你做了太多的写操作而没有上线同步它们,这个队列会增长得很快,它不仅write会减慢操作的速度,还会减慢你的速度read操作。
所以我建议使用这个数据库的在线功能。正如其中一位 Firebase 工程师所说,我引用了“在 Firestore 中构建慢查询是不可能的”。因此,性能来自后端的新索引功能,离线时这些优化不存在。
还有一件事,如果您有许多离线客户端试图写入同一个文档,那么当状态更改时,只有最后一个客户端会实际写入服务器。
因此,要回答您的问题,离线时没有正确的方法在 Firestore 中添加/更新数据,以减少内存使用量。只需上网即可!
| 归档时间: |
|
| 查看次数: |
2559 次 |
| 最近记录: |