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 查询

如何在 Flutter Firebase 应用中搜索并向附近的人发送通知?

Flutter:Firebase 如何更改查询和内容

如何使用颤振在firebase中进行查询?

如何使用 graphql 从 Firebase 使用 Flutter 从 Cloud Firestore 获取数据?

无法从 firebase 查询 Flutter 中获取单个记录