【问题标题】:How reliable is Firestore as an offline persistence mechanism?Firestore 作为离线持久性机制有多可靠?
【发布时间】:2018-05-24 13:45:18
【问题描述】:

我目前使用 Firebase Firestore 作为从各种来源检索数据的主要后端。我还使用 Android 的 Room 作为我的移动后端。当手机收到数据时,它会存储在 Room 数据库中,以防用户数天甚至数周都不会再次上网。

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

文件看起来像这样

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

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

【问题讨论】:

    标签: android firebase persistence google-cloud-firestore android-room


    【解决方案1】:

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

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

    性能

    由于 Cloud Firestore 主要用于在线使用,因此尚未同步到服务器的待处理写入会保留在队列中。如果您在没有联机解决它们的情况下执行许多待处理的写入,则该队列将会增长,并且会降低您的整体读/写性能。 Cloud Firestore 的大部分性能保证来自后端的索引和复制,但当您仅离线运行时,大部分优化都不存在。

    冲突

    Firestore 的基本冲突解决模型是“最后写入获胜”。因此,如果您有许多离线客户端写入同一个文档,那么只有最后一个上线的客户端才会真正“获胜”并坚持他们的更改。

    特点

    Firestore 的大部分功能都可以离线使用,但有一个主要例外:事务。交易只能在您在线时执行。因此,如果您的应用使用事务,如果不进行一些特殊处理,它将无法离线正常工作。

    【讨论】:

    • 感谢您的回复。我不知道 Transaction 元素无法离线工作,以及冲突解决方案。
    • 非常感谢。我找不到有关“最后写入获胜”策略的任何信息。它在我的测试中肯定是这样工作的。但我在文档中找不到任何提及
    • 可以直接访问SQLite数据库吗?
    【解决方案2】:

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

    我建议您不要将 Cloud Firestore 用作仅供离线使用的数据库。它真的被设计成一个在线实时数据库,可以在断开连接的短时间到中间时间段内工作。

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

    【讨论】:

    • 好的,谢谢。我选择使用 Android 的 Room 数据库进行持久化,并找到一种在两者之间同步的方法!
    • @martinomburajr 你是怎么做到的?
    • @GenaroAlbertoCancinoHerrera 最大的问题是 Room 和 Firestore 接受不同类型的类,即注释和其他细微差别的原因,所以我必须为两者创建一个中间类,例如UserRoom 用于房间交易,UserFirestore 用于 Firestore,然后是 User,我将在应用程序中使用它们。我有帮助器/构建器方法在不同类型的模型之间进行转换(模型具有相同的数据字段)。这是一个临时解决方案,因为我只有 4 个不同的模型。这是软件工程中适配器模式的一部分。
    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 2021-04-25
    • 1970-01-01
    • 2019-03-06
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多