FireStore Flutter多步骤查询

时间:2018-12-13 17:10:36

标签: firebase dart flutter google-cloud-firestore

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

我有一个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。任何帮助都将是惊人的。

User Collection

Player Collection

Events Collection

2 个答案:

答案 0 :(得分:0)

我对颤动不是很熟悉,所以我在代码方面帮不上忙。

但是要沿着正确的方向微调您:

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

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

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

答案 1 :(得分:0)

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

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]),
              );
            }),
      ),
    );
  }

这真的很好。