gpt4 book ai didi

firebase - 如何使用 Flutter 从 Firestore 中的 collectionGroups 查询数据

转载 作者:行者123 更新时间:2023-12-03 02:53:02 26 4
gpt4 key购买 nike

对于我在 Flutter 中构建的应用程序,我试图从 Firestore 的不同日期检索登录用户的保留时间段列表。我到了可以在给定日期检索保留时间段的地步(通过对这一天进行硬编码并将其传递给 futurebuilder),但是当我尝试从 collectionGroup 检索数据时, ListView 保持为空(快照没有数据)。现在,作为 Flutter 初学者,我发现理解如何处理 collectionGroup 查询非常困难,因此将不胜感激!

为了快速了解我的数据库的结构,我在 github 上包含了 2 张图片:

图一:https://github.com/winckles/rooster/blob/master/Schermafbeelding%202019-11-10%20om%2020.08.20.png?raw=true

图2:https://github.com/winckles/rooster/blob/master/Schermafbeelding%202019-11-10%20om%2020.08.43.png?raw=true

下面我包含了我的 futurebuilder 和 listview builder

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class TimesTest extends StatefulWidget {
@override
_TimesTestState createState() => _TimesTestState();
}

class _TimesTestState extends State<TimesTest> {

@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: MyFutureBuilder(),
),
);
}
}

class MyFutureBuilder extends StatelessWidget {

@override
Widget build(BuildContext context) {
return FutureBuilder(
future: MyTimes().getMyTimes('${loggedInUser.email}'),
builder: (context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(
backgroundColor: Colors.lightBlueAccent,
),
);
} else if (snapshot.hasData) {
return ListView.builder(
padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0),
itemCount: snapshot.data.documents.length,
itemBuilder: (BuildContext context, int index) {
DocumentSnapshot user = snapshot.data.documents[index];
return Padding(
padding: EdgeInsets.symmetric(
horizontal: 7.0,
vertical: 3.0,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Card(
color: Colors.white,
child: Container(
child: ListTile(
onTap: () {},
title: Text(
user.data['hour'],
style: TextStyle(
color: Colors.grey[900],
),
),
subtitle: Text(
user.data['reserved'],
style: TextStyle(
color: Colors.grey[900],
),
),
leading: Icon(
Icons.access_time,
color: Colors.grey[900],
),
),
),
),
],
),
);
});
} else if (snapshot.connectionState == ConnectionState.done &&
!snapshot.hasData) {
return Center(
child: Text('No times found'),
);
} else {
return Center(
child: Text('Something else is wrong'),
);
}
},
);
}
}

这就是我从 firestore 获取数据的方式。
import 'package:cloud_firestore/cloud_firestore.dart';

class MyTimes {
Future getMyTimes(String reserved) async {
return Firestore.instance
.collectionGroup('hours')
.where('reserved', isEqualTo: reserved)
.getDocuments();
}
}


我创建了一个集合 ID 为“小时”且集合范围为“collectionGroup”的索引,我现在的安全规则如下:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}

match /{path=**}/hours/{document}{
allow read, write;
}
}
}

我已经花了好几个小时试图找出这个问题,所以真的任何有用的东西都将不胜感激!

最佳答案

我找到了解决问题的方法;首先,当我删除 .where('reserved', isEqualTo: reserved) 时,我的快照可以从“小时”中检索所有数据。 ,但是当我包含它时它不起作用,所以代码起作用但只有查询不起作用。这是由于我的 Firestore 数据库的索引设置。我在这里阅读了有关 Firestore 索引的文档:
https://firebase.google.com/docs/firestore/query-data/index-overview?authuser=0#automatic_indexing

在我意识到我只做了一个综合索引而我没有看 之后单字段索引豁免 .我添加了两个豁免:

一个用于 collectionGroup 'hours' 中的字段 'hour',同时检查上升和下降的框,另一个用于 collectionGroup 'hours' 中的字段 'reserved',同时再次检查上升和下降的框。现在它确实有效!

关于firebase - 如何使用 Flutter 从 Firestore 中的 collectionGroups 查询数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58792123/

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