Flutter-如何在firebase查询中使用逻辑AND以及如何更新数据?
Posted
技术标签:
【中文标题】Flutter-如何在firebase查询中使用逻辑AND以及如何更新数据?【英文标题】:Flutter-How to use logical AND in firebase query and how to update data? 【发布时间】:2020-09-29 23:25:27 【问题描述】:我是新来的,在我的查询中寻找某种多重 where 子句或逻辑 AND 运算符,尝试了几件事,但没有一个对我有用。我正在过滤其 ID 与当前登录的用户 ID 匹配的用户。其次,firestore中有一个bool字段status,我也想过滤“status”==false。即
其中 userid=="当前登录的用户 ID" && status==false
Stream<QuerySnapshot> getData() async*
FirebaseUser firebaseUser = await FirebaseAuth.instance.currentUser();
yield* Firestore.instance.collection('order').where("userid", isEqualTo: firebaseUser.email.toString()).snapshots();
其次,我想在按钮按下时更新此批准 = false 以批准 = true 我该怎么做?我的 IDE 在其下方显示一条红线。
onPressed: () async
await db.collection('booking_tbl').document(doc.documentID).updateData('approve':true);
,
完整的代码在这里:
StreamBuilder<QuerySnapshot>(
stream: db.collection('booking_tbl').snapshots(),
builder: (context, snapshot)
if (snapshot.hasData)
return Column(
children: snapshot.data.documents.map((doc)
return ListTile(
title: Text("Press the button to confirm booking"),
trailing: IconButton(
icon: Icon(Icons.verified_user),
color: Colors.green,
onPressed: () async
await db.collection('booking_tbl').document(doc.documentID).updateData('approve':true);
,
),
),
).toList(),
);
else
return SizedBox();
),
【问题讨论】:
【参考方案1】:要执行和查询,您必须执行以下操作:
yield* Firestore.instance.collection('order').where("userid", isEqualTo: firebaseUser.email.toString()).where("status", isEqualTo: false).snapshots();
这将执行和查询,这意味着如果一个文档包含此用户 ID AND
状态为 false,那么您将检索该文档。
关于这里的错误:
onPressed: () async
await db.collection('booking_tbl').document(doc.documentID).updateData('approve':true);
,
updateData()
将地图作为参数,因此请执行以下操作:
onPressed: () async
await db.collection('booking_tbl').document(doc.documentID).updateData('approve':true);
,
【讨论】:
感谢我的第二个错误已解决,但第一个错误仍然存在,我可以为它做些什么? 没有错误但是它没有过滤结果 你确定userId等于用户邮箱吗? 应该是 firebaseUser.uid【参考方案2】:你只需堆叠 where 子句:
final QuerySnapshot snap = await Firestore.instance.collection("order")
.where("userid", isEqualTo: "id")
.where("status", isEqualTo: false)
.where("email", isEqualTo: "email")
.where("number", isGreaterThan: 3)
.getDocuments();
final List<DocumentSnapshot> docs = snap.documents;
作为流:
Stream<QuerySnapshot> getData() async
FirebaseUser firebaseUser = await FirebaseAuth.instance.currentUser();
return Firestore.instance.collection("order")
.where("userid", isEqualTo: "id")
.where("status", isEqualTo: false)
.where("email", isEqualTo: "email")
.where("number", isGreaterThan: 3)
.snapshots();
请注意,这只需要当前登录的用户,当用户注销并有新用户登录时,这不会更新。与您的方法不同的是,我只是映射流,而不是明确指定哪些元素到yield
(并且因为我只映射,该方法不需要标记async*
,只需async
,因为我仍然需要await
调用获取当前登录的用户)。
第二个问题,应该在另一个问题中,但是你需要给一个Map作为参数(包裹在中):
await db.collection('booking_tbl').document(doc.documentID).updateData("approve":true);
【讨论】:
我的第二个错误已解决,但第一个错误仍然存在,我可以为它做些什么? 我认为您的流映射有点奇怪,编辑后的答案以上是关于Flutter-如何在firebase查询中使用逻辑AND以及如何更新数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter Firebase 应用中搜索并向附近的人发送通知?