首页 > 解决方案 > 如何防止在 Firestore 中读取不必要的文档?

问题描述

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

我是 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 是否有一个我不知道的功能来解决这个问题?

谢谢..我是业余爱好者,因此非常感谢任何回复。

标签: firebasefluttergoogle-cloud-firestoreoffline

解决方案


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

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

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

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

如果有人有更好的答案,请仍然在这里发表评论。谢谢社区!

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

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

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

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


推荐阅读