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

时间:2018-02-23 08:17:43

标签: android google-cloud-firestore

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

我正在进行如下保存:

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

或者批量处理几条记录:

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

我有onComplete的听众,但是在this question的接受答案中,它似乎表明在大多数情况下听众是不必要的,并且当你离线时你不能等待它完成。< / p>

在另一个问题中,他们在代码中指出需要“快照”来正确进行在线和离线保存:Offline issue with Firestore vs Firebase。但我找不到其他任何地方,表明这是否会有所作为。我认为当你希望获得对文档或查询的更改通知时,Snapshot会附加到文档或查询中,如果没有删除,则附加类似的侦听器会导致内存泄漏。

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

所以这一切都导致了一个问题:在离线时在Firestore中添加/更新数据的正确方法是什么,以便应用程序的内存不会无限制地增长并减慢速度?

1 个答案:

答案 0 :(得分:3)

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

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

所以我建议将此数据库用于其在线功能。正如其中一位Firebase工程师所说的那样,&#34;在Firestore&#34;中建立慢查询是不可能的。因此,性能来自后端的新索引功能,当您离线时,这些优化并不存在。

还有一件事,如果您有许多尝试写入同一文档的脱机客户端,则在状态发生变化时,实际上只会将最后一个写入服务器。

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