【问题标题】:Is this intended behavior of Firestore caching/offline flow?这是 Firestore 缓存/离线流的预期行为吗?
【发布时间】:2019-08-06 06:42:10
【问题描述】:

我的问题是 Firestore 离线机制的工作原理(或者我不明白)。具体问题是,如果网络可用,数据首先从缓存中同步,而不是从在线同步。这很容易重现:

  1. 在您的 Firestore 数据库中,将其中一个变量的数据类型更改为错误的类型。例如,如果我们有文档“Person”,其中包含 String 类型的变量“name”,则将类型更改为数字并将 1 作为值。

  2. 您的应用程序现在将崩溃,因为 Firestore SDK 尝试将来自特定“Person”变量“name”int 的数据解析为字符串。

  3. 现在在 Firestore 数据库上修复此问题并将“名称”设置回字符串并设置值“测试名称”。

  4. 现在打开应用程序(网络可用)。

我在自己的应用程序中看到的问题是数据首先直接从缓存中获取,并且在缓存中,“Person”变量“name”仍然写为 int(firestore 上的数字)和应用程序即使我有活动的网络连接并且我直接在 Firestore 数据库上修复了数据类型,它也无法从在线获取更新的值。

在这种情况下防止崩溃的唯一解决方案是让用户清除应用程序存储/缓存并再次进入应用程序。对于其他用户来说,这也是可重现的问题吗?这是预期的行为吗?

如果需要更多解释请写在cmets中。

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    这是预期的行为。您应该使用一些策略组合来防止由于不良数据导致的问题:

    1. 显然,验证所有写入都包含您期望的类型。使用安全规则在服务器上验证这些类型。
    2. 始终假定 Firestore 可以在您阅读文档时为您提供意外数据。在假设某个类型与您的想法相同之前,请实际检查该类型以确保您的假设是正确的。

    清除缓存不应该是您的生产解决方案。采取措施确保只有好的数据进入,并且只有好的数据在流出时得到处理。

    【讨论】:

    • 但是我不明白为什么数据是从缓存中获取的,但是在接下来的几毫秒内它是从在线数据库中获取的。如果我打开崩溃的应用程序并再次启动 Firestore 并拥有活动网络,为什么它甚至先获取旧的缓存数据并在使用在线数据后立即更新它?在文档中它这样说(请阅读第二段):firebase.google.com/docs/firestore/query-data/…
    • 本地写入(缓存)被认为是最新的准确信息,因为客户端信任自己的写入。如果您发现缺少这方面的文档,请使用页面顶部的“发送反馈”链接来说明您感到困惑的地方。
    猜你喜欢
    • 2018-03-28
    • 2021-05-05
    • 1970-01-01
    • 2018-07-26
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多