Firestore作为离线持久性机制有多可靠?

26

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

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

输入图像说明

该文件看起来类似于这样 输入图像说明

我已经阅读了有关Firestore离线持久性的文档,但没有说明离线持久性的耐久性。它提到了数据被缓存,但没有说明缓存多长时间。我的问题是Firestore离线持久性的耐久性如何。是否建议使用它来代替完整的本地数据库存储长时间(几天、几周)未同步的数据?

它似乎已经很好地处理了重新建立连接后的数据同步。我只是担心系统在某个时刻可能会删除该文件并导致用户丢失所有数据。

2个回答

37
截至本文撰写时,Android上的Firestore使用SQLite作为持久化机制。因此,在断断续续的离线活动期间,您不应该遇到性能或耐久性方面的问题。
但是,如果您将要离线数天或数周(如您所说),则有一些事情需要注意:
性能
由于Cloud Firestore主要用于在线使用,尚未同步到服务器的挂起写入会被保留在队列中。如果您进行多个挂起写入而不上线解决它们,那么该队列将增长,并且会减慢您的整体读/写性能。大多数Cloud Firestore的性能保证来自后端的索引和复制,但当您仅处于离线状态时,这些优化大多不存在。
冲突
Firestore的基本冲突解决模型是“最后写入获胜”。因此,如果有许多离线客户端同时写入同一文档,则只有最后一个上线的客户端实际上会“获胜”并保留其更改。
功能
Firestore的大多数功能都可以在离线状态下工作,但有一个重要例外:交易。交易只能在您在线时执行。因此,如果您的应用程序使用交易,则需要进行一些特殊处理才能正常离线工作。

谢谢您的回复。我不知道事务元素在离线状态下无法工作,以及冲突解决方案。 - martinomburajr
1
非常感谢。我找不到关于“最后写入获胜”策略的任何信息。在我的测试中,它确实是这样工作的。但是我在文档中找不到任何提及。 - Shyri
1
你能直接访问SQLite数据库吗? - dustytrash
很有趣,直接在SQLite数据库上进行查询是可能的吗?我很想这样做。 - shababhsiddique

10
官方文档中没有关于离线持久性有多耐用的迹象,因为它是无法预测的。这个问题没有一个确切的答案,比如4周或类似的东西,因为它取决于您离线时进行了多少写操作。
我建议您不要将Cloud Firestore用作仅离线数据库。它真正设计为在线实时数据库,可以在短到中等时间内断开连接。
离线时,它会保留所有写操作的队列。随着这个队列的增长,本地操作和应用程序启动会变慢。但您需要知道,即使您重新启动设备,这些操作也将持久存在。您不会丢失任何数据。

1
是的,谢谢。我选择使用Android的Room数据库进行持久化,并找到了在两者之间同步的方法! - martinomburajr
4
@martinomburajr 你是怎么做到的? - Genaro Alberto Cancino Herrera
2
@GenaroAlbertoCancinoHerrera 最大的问题是Room和Firestore接受不同类型的类,因为注释和其他细微差别,所以我不得不为两者创建一个中间类,例如UserRoom用于Room事务,UserFirestore用于Firestore,然后使用User在应用程序中。我有帮助器/构建器方法来在不同类型的模型之间进行转换(这些模型具有相同的数据字段)。这只是一个临时解决方案,因为我只有4个不同的模型。这是软件工程中适配器模式的一部分。 - martinomburajr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接