【问题标题】:FireStore Flutter Multi-Step QueryFireStore Flutter 多步查询
【发布时间】:2019-05-14 23:14:50
【问题描述】:

我是第一次在 Flutter 中开发一个项目,并试图找到组织我的 Firestore 数据库的最佳方式。我相信我有我想要的方式,但无法弄清楚如何正确查询它。

我有一个用户,其 ID 指向一个集合,该集合将玩家个人资料与其用户个人资料相关联(在单独的集合中)。

我需要:

  1. 获取 Firebase currentUser uid
  2. 找到相关的玩家资料
  3. 获取保存到玩家个人资料的事件 ID
  4. 基于 ID 的事件列表

我猜是这个顺序。

DatabaseReference getCurrentUserRef() async {
    return this.usersRef.child((await this.getCurrentUser()).uid);
  }

var user = await getCurrentUserRef()
var _playerEvents = [];

db.collection('player').where('id', isEqualto: user).get().then((doc) => {
   db.collection('player').doc(doc.data().id).collection('events').get().then((snapshot) => {
      snapshot.forEach(doc) {
         _playerEvents.push(doc.data().id);
      }
   });
});

然后使用该数组,我需要根据这些 id 获取所有事件(如果有的话)

_playerEvents.forEach(event) {
    db.collection('events').where('id', isEqualTo: event).get().then((doc) => {
         //somehow popular a Map or JSON that I can show in a list view on the page for the events associated with that player
         List_Item for display
    });
}

这是我的数据库的一些屏幕。我正在学习使用飞镖的 Flutter。任何帮助都会很棒。

【问题讨论】:

    标签: firebase dart flutter google-cloud-firestore


    【解决方案1】:

    我对 Flutter 不是很熟悉,所以无法在代码方面为您提供帮助。

    但要推动你走上正确的道路:

    Firestore 是异步的。因此,要完成上述所有 4 个步骤,您需要使用回调来完成它们。

    我不认为你可以用那种方式级联查询(如果它类似于 Java,你不能这样做)。

    您需要做的是在每次查询完成后引入回调,以便您有足够的信息来进行下一次查询。

    【讨论】:

    • 我没有正确使用 Async await 和 .then() 表示法吗?
    【解决方案2】:

    我实际上刚刚结束了切换我的数据库并查询了一个包含具有特定值的数组的集合。

    Widget _buildTeamList() {
        return Container(
          child: Center(
            child: StreamBuilder(
                stream: Firestore.instance
                    .collection('teams')
                    .where("players", arrayContains: user['player_id'])
                    .snapshots(),
                builder: (context, snapshot) {
                  if (!snapshot.hasData) return const Text('Loading...');
                  return ListView.builder(
                    itemCount: snapshot.data.documents.length,
                    itemBuilder: (context, index) =>
                        _buildTeamItem(context, snapshot.data.documents[index]),
                  );
                }),
          ),
        );
      }
    

    这非常有效。

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2019-11-02
      • 2021-11-13
      • 2018-10-23
      • 2018-08-02
      • 2018-11-26
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      相关资源
      最近更新 更多