【问题标题】:What exactly does Firestore synchronization do?Firestore 同步到底有什么作用?
【发布时间】:2019-11-03 01:14:03
【问题描述】:

https://firebase.google.com/docs/firestore 说:

与实时数据库一样,Cloud Firestore 使用数据同步来更新任何连接设备上的数据。

我正试图弄清楚这个“数据同步”是由什么组成的。

https://firebase.google.com/docs/firestore/manage-data/enable-offline 说:

启用持久性后,Cloud Firestore 会缓存从后端接收到的每个文档以供离线访问。

Cloud Firestore 是否会在后端发生更改时更新该缓存? 例如,如果我的缓存中有某个文档,该文档是否 更新(a)在后端更改该文档时自动更新或 (b) 每当我使用该文档进行查询时,我恰好在线 当时?

更新

我要重述我的最后一段,因为它被误解了 至少一个人。

想象以下场景:

  • 我有一部智能手机。为方便起见,假设智能手机 一直在线。
  • 此智能手机上安装了一个包含 Firestore SDK 的移动应用。
  • 该应用已启用 Firestore 缓存。
  • 缓存包含例如 1000 个文档。

现在我的问题是:如果这些文档之一在云中更改(而不是 智能手机),在什么情况下 Firestore SDK 会更新 缓存中的文档?它会(a)很快自动更新文档吗 在云上进行更改之后,或 (b) 下次更新文档时 移动应用执行使用文档的查询?

【问题讨论】:

  • 虽然我手头没有任何链接,但我很确定我已经多次听到 B) 会发生什么。例如,客户端上的每个 Firestore 更新都算作计费读取。因此,您需要有一种方法来控制它。我认为这一切都是有道理的,那里没有魔法。只有当您进行查询(或者可能监听 on change 监听器)时,缓存才会更新。

标签: firebase google-cloud-firestore


【解决方案1】:

在我看来,两个突出显示的段落都是直截了当的解释,并回答您的问题:

Firestore 是否会在后端发生更改时更新该缓存?

是的,如果您离线并且更改了某些文档,一旦您重新在线,您将获得所有更改的文档,反之亦然,如果您在本地(在您的缓存中)更改某些文档,当您重新在线时,所有更改的文档会发送到 Firebase 服务器。

如果您有一个返回 10 个文档的查询,这意味着您与 10 个文档同步,这基本上意味着如果这 10 个文档发生更改,则仅针对该更改触发您的侦听器。

当文档在后端发生更改时,文档是否会自动更新(a)

是的,首先在您的缓存中,一旦您重新上线,也在 Firebase 服务器上。

每当我使用该文档进行查询时,我恰好在线?

只要您在线并更改了文档,就会实时通知您。

编辑:

如果这些文档之一在云端(不是在智能手机上)发生更改,Firestore SDK 在什么情况下会更新缓存中的文档?它会 (a) 在云上进行更改后立即自动更新文档,还是 (b) 下次移动应用执行使用文档的查询时更新文档?

只要您与这些文档保持同步,它就会在文档更改的第二刻发生。我通过同步的意思是,您在代码中使用get() 调用来获取这些文档,或者如果您正在实时监听文档更改。只需在不使用侦听器的情况下创建对文档或查询的引用,您就不会收到任何通知。

下次移动应用执行使用文档的查询时更新文档?

不正确,因为您在线并与文档同步,因此立即触发侦听器。

编辑2:

简而言之,每次文档发生更改时都会调用一个侦听器。 “下次应用程序执行查询”不是正确的句子,因为当您创建查询并附加侦听器时,您始终与数据库同步,并且当文档发生更改时,您会立即收到通知。 ,文档链接在数据库中,当我查询(在某个时间点)时,我得到了更改,不,您总是在更改发生时收到通知。这就是实时数据库的美妙之处,在发生更改时收到通知:)

【讨论】:

  • 对不起,我想你误解了我的问题。请查看我附加到问题的更新。
  • 对不起,我还是不明白。 (可能相关:我从未编写过 Firestore 客户端;我只是在为一个项目评估 Firestore,并且我已经阅读了一些文档。)无论如何感谢您的尝试。
  • 请再看看我更新的答案,你现在还好吗?
  • 嗨蓝胡子!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我会很感激的。谢谢!
【解决方案2】:

如果您启用了本地缓存,Firestore 会自动将其接收到的所有文档存储在该本地缓存中。

这只发生在您的应用通过调用get()onSnapshot 请求文档时。 Firestore 不会自动代表您请求文件。所以如果你的应用没有请求文档,缓存就不会更新。

【讨论】:

  • 请注意,只有 Android 和 iOS 应用程序默认启用自动缓存。对于网络应用程序(我假设是其他客户端),您需要调用 enablePersistence() 方法。
猜你喜欢
  • 2021-10-30
  • 2013-11-29
  • 2017-07-26
  • 2011-04-18
  • 2013-03-21
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多