如何防止在 Firestore 中读取不必要的文档?

How to prevent unnecessary Document read in Firestore?

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

谢谢..我是业余爱好者,所以非常感谢您的回复。

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

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

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

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

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

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

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

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

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