【问题标题】:how delete a specific node in firebase?如何删除firebase中的特定节点?
【发布时间】:2019-10-29 20:15:46
【问题描述】:

我连接了 firebase 并在其中制作了保存数据。但我无法删除 firebase 中的特定条目。

我尝试通过我在下面编写的方法删除。但它不起作用。

final FirebaseDatabase _database = FirebaseDatabase.instance;
delData(String phoneNumber) {_database.reference()
.child('phoneNumber')
.remove()
.then((_) {
    print("Delete $phoneNumber successful");
    setState(() {
      // 
    });
  });
}

更新

Frank van Puffelen 建议我的方法不能正常工作,它会删除所有带有 phoneNumber 字段的条目,我需要删除带有授权用户的电话号码的条目。此外,该方法会在使用 phoneNumber 字段添加新便笺时进行侦听并自动将其删除

removeNode() {
    FirebaseDatabase.instance.reference()
        .child('customers')
        .orderByChild('phoneNumber')
        .equalTo(phoneNumber)
        .onChildAdded.listen((Event event) {
      FirebaseDatabase.instance.reference()
          .child('customers')
          .child(event.snapshot.key)
          .remove();
    }, onError: (Object o) {
      final DatabaseError error = o;
      print('Error: ${error.code} ${error.message}');
    });
  }````
// This is how is i add data to DB     
   ````void handleSubmit() {
      final FormState form = formKey.currentState;
      print(userPhone);
      if (form.validate()) {
        form.save();
        form.reset();
        itemRef.push().set(item.toJson());}````

也许我应该使用 Firestore?

【问题讨论】:

    标签: firebase firebase-realtime-database flutter dart


    【解决方案1】:

    2022 年 1 月 12 日。为我工作。

    Future<void> delteteNode async {
    DataSnapshot event = await database.ref('customers')
       .orderByChild('phoneNumber')
       .equalTo('+79644054946')
       .get();
    Map<dynamic, dynamic> children = event.value as Map<dynamic,dynamic>;
    children.forEach((key, value) {
    database.ref('customers')
       .child(key)
       .remove();
      });
    }
    

    我不明白,现在是下午 23 点。我不能用这个。 错误:[firebase_database/index-not-defined] 索引未定义。 当我使用 get 时,我不能 equalTo。现在我用一次。

    DatabaseEvent event = await database.ref('customers')
    .orderByChild('phoneNumber')
    .equalTo('+79644054946')
    .once();
      Map<dynamic, dynamic> children = event.snapshot.value as Map<dynamic, dynamic>;
       children.forEach((key, value) {
       database.ref('customers')
      .child(key)
      .remove();
      });
     }
    

    【讨论】:

      【解决方案2】:

      为了删除一个节点,您需要知道该节点的完整路径。如果您不知道完整的路径,可以使用查询来确定它。

      因此,在您的情况下,如果您知道要删除的节点的电话号码,则可以查询具有该电话号码的所有节点(因为可能有多个),然后将其删除。

      此代码如下所示:

      FirebaseDatabase.instance.reference()
        .child('customers')
        .orderByChild('phoneNumber')
        .equalTo('+79644054946')
        .onChildAdded.listen((Event event) {
          FirebaseDatabase.instance.reference()
            .child('customers')        
            .child(event.snapshot.key)
            .remove();
        }, onError: (Object o) {
          final DatabaseError error = o;
          print('Error: ${error.code} ${error.message}');
        });
      

      更新 (20200221):您还可以使用 once() 侦听器并循环其子节点:

      FirebaseDatabase.instance.reference()
        .child('customers')
        .orderByChild('phoneNumber')
        .equalTo('+79644054946')
        .once()
        .then((DataSnapshot snapshot) {
          Map<dynamic, dynamic> children = snapshot.value;
          children.forEach((key, value) {
            FirebaseDatabase.instance.reference()
              .child('customers')        
              .child(key)
              .remove();
          })
        });
      

      【讨论】:

      • 谢谢,我测试了这段代码,不幸的是它只删除了firebase中与手机的线路,您需要删除用户授权号码的整个记录​​。此外,您的代码会删除存储电话号码的变量的内容。
      • 我在答案中使用了硬编码的电话号码,这样就不会依赖我们看不到值的变量。我的答案中的代码删除了/customers 下与电话号码匹配的直接子节点。如果它为您做了其他事情,请使用重现该问题的最少代码更新您的问题。
      • 我想做的好像不会在firebaseDatabase中实现,我想用firestore,不告诉我怎么适配firestore的代码?
      • 在 Firestore 中删除数据与在实时数据库中没有显着差异。您也需要运行查询以确定要删除的文档的完整路径。我很确定我分享的代码是您需要做的,所以如果您在实现它时遇到问题,请根据我的回答更新您的问题以包含您尝试过的内容。
      • 您的代码似乎工作正常,但它会删除应用程序中的电话号码。请告诉我如何在删除之前复制它(对象,而不是指向它的链接),或者如何从 currentUser FirebaseUser 获取电话号码,我尝试了不同的方式,但没有成功
      猜你喜欢
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多