gpt4 book ai didi

firebase - 如何在 Firestore 中加入内部连接

转载 作者:IT王子 更新时间:2023-10-29 06:49:40 24 4
gpt4 key购买 nike

我想构建一个 View 来在我的应用程序的 ListView 中显示一些事件,如下所示:

Event example

我有这两张表:

Users enter image description here

Events enter image description here

但我不知道如何在表 USERSEVENTS 之间进行“内部连接”...

我试过这个:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:project/Methods.dart';
import 'package:project/Views/CadastroUsuario.dart';
import 'dart:math';

class EventClass{
String owner;
String description;
String city;
String state;
String place;
}

class EventsListing extends StatefulWidget {
@override
EventsListingState createState() => new EventsListingState();
}

class EventsListingState extends State<EventsListing> {
List<EventClass> events;

@override
void initState() {
super.initState();
events = new List<EventClass>();
}

void buildEventClass(DocumentSnapshot doc) async {
EventClass oneEvent = new EventClass();

DocumentReference document = Firestore.instance.collection("users").document(doc["userid"]);

document.get().then((DocumentSnapshot snapshot){
oneEvent.owner = snapshot["name"].toString();
});
oneEvent.description = doc["description"];
oneEvent.place = doc["place"];
oneEvent.city = doc["city"];
oneEvent.state = doc["state"];
events.add(oneEvent);
}

@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Events'),
),
body: new StreamBuilder(
stream: Firestore.instance.collection("events").snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){
if (snapshot.connectionState == ConnectionState.waiting)
return Text("Loading...");

return new ListView(
padding: EdgeInsets.only(left: 5.0, right: 5.0, top: 5.0),
children: snapshot.data.documents.map((document){
buildEventClass(document);
return events.length == 0 ? new Card() : item(events.last);
}).toList()
);
},
),
floatingActionButton: new FloatingActionButton(
tooltip: 'New',
child: new Icon(Icons.add),
onPressed: () async {
Navigation navigation = new Navigation();
navigation.navigaTo(context, CadastroUsuario());
},
),
);
}

Widget item(EventClass oneEvent) {
return new Card(
elevation: 4.0,
child: new Column(
children: <Widget>[
new Row(
children: <Widget>[
new Column(
children: <Widget>[
new Text(oneEvent.owner.toString(),
style: TextStyle(fontSize: 20.0),
overflow: TextOverflow.ellipsis,),
],
),
new Column(
children: <Widget>[

],
)
],
),
new Container(
color: Colors.blue,
height: 150.0,
),
new Row(
children: <Widget>[
new Row(
children: <Widget>[
new Text(oneEvent.description.toString(),
style: TextStyle(fontSize: 20.0),
overflow: TextOverflow.ellipsis,),
],
),
new Row(
children: <Widget>[
new Text(oneEvent.place.toString(),
style: TextStyle(color: Colors.grey[350]),
overflow: TextOverflow.ellipsis,),
],
),
new Row(
children: <Widget>[
new Text(oneEvent.city.toString() +' - '+ oneEvent.state.toString(),
style: TextStyle(color: Colors.grey[350]),
overflow: TextOverflow.ellipsis,),
],
)
]
)
],
)
);
}
}

但每次我尝试显示这些事件时,我都会遇到此异常

Exception has occurred.
PlatformException(error, Invalid document reference. Document references must have an even number of segments, but users has 1, null)

我做错了什么?如何在这些表之间进行“内部连接”并显示事件?

我正在使用 Firebase Firestore。

PS:我已经知道 Firestore 是一个 noSQL 数据库并且没有“连接”,但我想做一些类似连接的事情。

最佳答案

正如我在评论中所说,Firestore 不支持多集合查询,因为它没有关系数据库。如果您需要访问多个集合,您将独立管理查询。

这是我通常获取相关集合数据的方式(抱歉,这是 JS 代码,但我不知道 DART):

    var data = {};

//First you get users data
DocumentReference document = Firestore.collection("users")

document.get().then((snapshot) => {

//In this case I will store data in some object, so I can add events as an array for a key in each user object

snapshot.forEach((userDoc) => {
var userDocData = userDoc.data()

if (data[userDoc.id] == undefined) {
data[userDoc.id] = userDocData
}

})

//So in this moment data object contains users, now fill users with events data

//In this var you count how many async events have been downloaded, with results or not.
var countEvents = 0

Object.keys(data).forEach((userDocId) => {

//Here Im creating another query to get all events for each user

SnapshotReference eventsForCurrentUserRef = Firestore.collection("events").where("userId", "==", userDocId)

eventsForCurrentUserRef.get.then((eventsForUserSnapshot) => {
//Count events
countEvents++

eventsForUserSnapshot.forEach((eventDoc) => {

var eventDocData = eventDoc.data()

//Check if array exists, if not create it
if (data[eventDocData.userId].events == undefined) {
data[eventDocData.userId].events = []
}

data[eventDocData.userId].events.push(eventDocData)


})

if(countEvents == Object.keys(data).length){
//Lookup for events in every user has finished
}

})


})

})

关于firebase - 如何在 Firestore 中加入内部连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52865578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com