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

标签 firebase flutter google-cloud-firestore offline

这个问题与 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 中创建一个文档来存储最新更新信息并仅监听该 1 个文档。如果有变化,则从本地DB中最新的数据开始用新数据更新本地DB

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

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

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

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

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

关于firebase - 如何防止Firestore中不必要的文档读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59151111/

相关文章:

dart - Flutter - 是否可以取消选择底部导航栏上的所有项目?

Flutter 3.0 显示错误 : WidgetsBinding. instance!.addPostFrameCallback((_) => widget.onReady.call());

ios - Firebase queryOrderedByKey 不按时间顺序对帖子进行排序

flutter - 如何在Flutter中为文本字段自动显示键盘

javascript - Firebase Cloud Firestore 查询找不到我的文档

firebase - Firebase 云存储规则能否针对 Firestore 数据进行验证?

javascript - firebase中实时数据库和fireStore之间的区别?

android - 在 Firebase Invites 中设置目标邮件地址

javascript - 将输入类型时间转换为 firestore 的时间戳

angular - 如何使用 Angular Firestore 获取集合中的文档列表