【问题标题】:How to prevent unnecessary Document read in Firestore?如何防止在 Firestore 中读取不必要的文档?
【发布时间】:2020-03-27 18:51:14
【问题描述】:

这个问题与this one 类似,但由于我没有足够的声誉,我无法回复任何答案。所以我创建了一个新问题。

我是 Flutter 和 Firebase 的新手。请多多包涵.. 我打算将我的应用从另一个数据库移到 Firestore。

所以我有一个包含图像信息和最新更新时间戳的 3K 文档集合。 问题是应用程序每次启动时(如果相隔 30 分钟),它将读取整个 3K 文档并显示在我的 Firebase 控制台中。 在我的测试中,一个普通用户每天会引起大约 8K-10K 的新读取!!即使我使用分页,它也会一遍又一遍地重复读取相同的数据,它仍然算作新读取..那太疯狂了.. 但是,如果我禁用了我的网络,该应用程序实际上能够在一天后从缓存中获取,而无需重新连接到 Firestore。

图像每天大约添加 4 张,因此每次加载都阅读整个 3K 文档是没有意义的。

我看到了一些使用本地数据库的解决方案。但是,如果我需要另一个本地数据库,那么使用 Firestore 有什么意义呢?我希望我不需要这样做..

所以我有一个想法,但我被困在某个地方.. 将最新更新存储在 SharedPreferences 中,并从缓存中存储的最新更新开始获取文档。但我被困在这里,我希望有人能帮助我:

  1. 我们如何在 Flutter 中禁用 Firestore 网络并仅从缓存中读取?我怎么知道它来自缓存?

  2. 如何更新缓存中的数据?因为如果我这样做:

Firestore.instance.collection('images').where('last_update', isGreaterThan: lastUpdateInCache).snapshots();

这只会显示最新更新后的快照。我应该将列表与旧的连接起来吗?但我不想连接列表,因为这意味着我需要复制数据,而且会占用大量内存。

Firestore 是否有一个我不知道的功能来解决这个问题?

谢谢你..我是一个业余爱好者,所以任何回复都将非常感激。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore offline


    【解决方案1】:

    所以终于在高高在上之后,显然除了将数据持久保存在本地数据库中之外,目前没有任何解决方案。 因为:

    1. 所有已阅读的文档将在 30 分钟不活动后重新阅读。
    2. 模拟离线和在线非常麻烦。

    所以最后我的解决方案是:

    1. 使用 Sembast 作为本地 DB(到目前为止一切正常)来持久化数据。
    2. 在 Firestore 中创建一个文档以存储最新的更新信息,并且只收听该 1 个文档。如果有变化,则从本地数据库中的最新数据开始使用新数据更新本地数据库

    如果有人有更好的答案,请在此处发表评论。感谢社区!

    ***** 更新: 有一种方法可以只从缓存中获取数据:

    FirebaseFirestore.instance
        .collection(kCollection).get(GetOptions(source: Source.cache));
    

    所以只需添加GetOptions(source: Source.cache),您就可以随时从缓存中获取它。让我知道这是否有帮助。

    == == == == == == ==

    【讨论】:

    • 您能找到比这更好的解决方案吗?我也面临着类似的问题。
    • 所以我想在一段时间后定期读取数据。为每个用户制作时间戳以检测我是否要获取新数据或使用缓存数据是否是一种好方法?假设我想每天更新一次,所以我检查 now 和 lastUpdated Timestamp 之间的差异并决定使用 Source.Server 或 Source.Cache。或者这是不可能的,因为只能有 30 分钟不活动?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2012-12-05
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多