Firestore作为离线持久性机制的可靠性如何?

mar*_*ajr 17 android persistence firebase android-room google-cloud-firestore

我目前正在使用Firebase Firestore作为主要后端,从各种来源检索数据.我也使用Android的房间用于我的移动后端.当手机接收到数据时,如果用户几周甚至几周不再上线,它就会存储在房间数据库中.

查看设备文件后,我看到firestore将数据保存在目录下的/data/data/<your-app>/databases文件中.

在此输入图像描述

该文件看起来像这样 在此输入图像描述

我已经阅读了firestore上的脱机持久性文档,并且没有迹象表明脱机持久性是多么持久.它提到数据被缓存但不是多长时间.我的问题是,Firestore的离线持久性的持久性是多少.是否会建议使用它而不是使用完全成熟的本地数据库来存储可能无法在很长一段时间(几天,几周)内同步的数据?

一旦重新建立连接,似乎已经很好地处理了同步数据.我只是担心在某些时候该文件可能被系统删除而用户丢失了所有内容.

Sam*_*ern 25

在Android上(撰写本文时),Firestore使用SQLite作为持久性机制.因此,对于间歇性的离线活动,您应该没有性能或耐用性问题.

但是,如果您要离线数天或数周(如您所说),您应该注意以下事项:

性能

由于Cloud Firestore主要用于联机,因此尚未同步到服务器的挂起写入将保留在队列中.如果您在没有联机解决问题的情况下执行许多挂起写入操作,那么该队列将会增长并且会降低整体读/写性能.大多数Cloud Firestore的性能保证来自后端的索引和复制,但是当您仅在脱机操作时,大多数优化都不存在.

冲突

Firestore的基本冲突解决模型是"最后写入胜利".因此,如果您有许多离线客户端写入同一文档,则只有最后一个联机客户端实际上会"赢"并持续进行更改.

特征

大多数Firestore的功能都脱机工作,但有一个主要的例外:事务.交易只能在您上线时执行.因此,如果您的应用使用交易,如果没有一些特殊处理,它将无法正常离线.


Ale*_*amo 6

官方文档中没有说明离线持久性有多持久,因为它无法预测。这个问题不能有确切的答案,比如 4 周或类似的时间,因为这取决于离线时发生的写入操作的数量。

我建议您不要将 Cloud Firestore 用作仅供离线使用的数据库。它实际上是作为一个在线实时数据库设计的,可以在断开连接的中短期内工作。

离线时,它将保留所有写入操作的队列。随着这个队列的增长,本地操作和应用程序启动会变慢。但是您需要知道即使您重新启动设备,这些操作也会持续存在。你不会丢失任何数据。

  • @martinomburajr 你是怎么做到的? (4认同)
  • @GenaroAlbertoCancinoHerrera 最大的问题是 Room 和 Firestore 接受不同类型的类,即注释的原因和其他细节,所以我必须为两者创建一个中间类,例如用于 Room 事务的 `UserRoom`,用于 Firestore 的 `UserFirestore`,然后是 `User ` 我会在应用程序中使用它。我有帮助器/构建器方法来在不同类型的模型之间进行转换(模型具有相同的数据字段)。这是一个临时解决方案,因为我只有 4 个不同的模型。这是软件工程中适配器模式的一部分。 (2认同)