【问题标题】:How do I store a Firestore document locally?如何在本地存储 Firestore 文档?
【发布时间】:2018-07-13 04:21:54
【问题描述】:

我有一个不经常更改的 Firestore 文档,并在我的应用程序的许多不同位置用作查找表。据我了解,当我获取文档时,它总是在执行服务器查询,即使文档中的数据没有改变。本地缓存仅在服务器不可用时使用。

由于文档不经常更改,我想做这样的事情......

1) 应用启动时,获取文档并存储在本地。

2) 设置一个监听器,以便在文档更改时更新本地副本。

3) 当本地副本更新时,将此更改广播到可能正在使用该文档的任何小部件。

这是我希望 Firestore 默认工作的方式。

这是个好主意吗?关于如何实现这一点的任何建议?

【问题讨论】:

  • 您读到了什么表明没有现有的本地文档缓存?文档另有建议:firebase.google.com/docs/firestore/manage-data/enable-offline
  • 当服务器无法访问时,有一个本地文档缓存。但是,我想始终首先参考文档缓存,而不是每次需要数据时都发出新的服务器请求。这是因为此特定文档很少更改。大多数时候缓存仍然有效。
  • 您观察到哪些行为表明在您建议的情况下未使用本地缓存?
  • 运行跟踪显示了一个 HTTP 查询,我的性能监控也是如此。并且文档说当服务器无法访问时使用本地缓存。我做错了吗?
  • 我不确定如何直接访问本地缓存,但如果您可以通过 REST API 访问文档,则可以使用文档的 URL 以及 network_resource 包。如果您可以以这种方式访问​​文档,我很乐意编写一个简单的示例。

标签: google-cloud-firestore flutter


【解决方案1】:

这就是我最终要做的事情。这实际上是相当直截了当的。我将它实现为一个静态类,但不确定这是否是最好的方法。但我喜欢其他一切。

我创建了一个类,它为文档设置了一个监听器,并在文档更新时提供了一个流。作为一项附带工作,我的班级还将文档解析为地图并对游戏进行排序。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:async';
import 'package:pari/game.dart';

class Schedule {
  static Map<String, Game> games = Map<String, Game>();

  static StreamController<Map<String, Game>> _onUpdateController = StreamController.broadcast();
  static Stream get onUpdate => _onUpdateController.stream;

  static void setupListener() {
    print('setupListener');

    DocumentReference reference = Firestore.instance.collection('schedule').document('2018');
    reference.snapshots().listen((documentSnapshot) {
      print('listen begin');

      List<Game> sortedList = List<Game>();
      documentSnapshot.data.values.forEach((value) {
        Game game = Game.fromMap(value);
        sortedList.add(game);
      });
      sortedList.sort((a,b) => a.startTime.compareTo(b.startTime));

      games.clear();
      sortedList.forEach((game) {
        games.addAll({game.key: game});
      });

      _onUpdateController.add(games);

      print('listen end');
      print('games: ${games.length}');
    });
  }
}

【讨论】:

  • 你最后在哪里调用 setupListener()?
  • 当我的应用初始化时。
猜你喜欢
  • 2020-10-05
  • 2014-10-21
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2020-08-18
相关资源
最近更新 更多