Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除firebase中的特定节点?_Firebase_Firebase Realtime Database_Flutter_Dart - Fatal编程技术网

如何删除firebase中的特定节点?

如何删除firebase中的特定节点?,firebase,firebase-realtime-database,flutter,dart,Firebase,Firebase Realtime Database,Flutter,Dart,我连接了firebase并在其中保存了数据。但我无法删除firebase中的特定条目 我尝试通过我在下面写的方法删除。但它不起作用 final FirebaseDatabase _database = FirebaseDatabase.instance; delData(String phoneNumber) {_database.reference() .child('phoneNumber') .remove() .then((_) { print("Delete $phoneNum

我连接了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?

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

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

这方面的代码如下所示:

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();
    })
  });
FirebaseDatabase.instance.reference()
.child(“客户”)
.orderByChild(“电话号码”)
.equalTo(“+79644054946”)
.一次
.then((数据快照快照){
Map children=snapshot.value;
children.forEach((键,值){
FirebaseDatabase.instance.reference()
.child(“客户”)
.儿童(钥匙)
.remove();
})
});

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

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

这方面的代码如下所示:

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();
    })
  });
FirebaseDatabase.instance.reference()
.child(“客户”)
.orderByChild(“电话号码”)
.equalTo(“+79644054946”)
.一次
.then((数据快照快照){
Map children=snapshot.value;
children.forEach((键,值){
FirebaseDatabase.instance.reference()
.child(“客户”)
.儿童(钥匙)
.remove();
})
});

谢谢,我测试了此代码,不幸的是,它只删除了firebase中手机的线路,您需要删除用户授权号码下的整个记录。此外,您的代码会删除存储电话号码的变量的内容。我在回答中使用了硬编码的电话号码,这样就不会依赖于我们看不到其值的变量。我的答案中的代码删除了与电话号码匹配的
/customers
下的直接子节点。如果它为您做了其他事情,请使用复制该问题的最小代码更新您的问题。看起来我想做的事情不会在firebaseDatabase中实现,我想使用firestore,请不要告诉我如何将我的代码改编为firestore?在firestore中删除数据与在实时数据库中删除数据没有明显区别。此外,您还需要运行查询以确定要删除的文档的完整路径。我很确定我共享的代码是您需要做的,因此,如果您在实现它时遇到问题,请更新您的问题,以包括您根据我的答案尝试的内容。您的代码似乎工作正常,但它会将应用程序中的电话号码删除到。请告诉我如何在删除之前复制它(对象,而不是指向它的链接),或者如何从currentUser FirebaseUser获取电话号码,我尝试了不同的方法,但没有成功谢谢,我测试了此代码,不幸的是,它只删除了firebase中与电话相连的线路,您需要删除整个记录,其中包含授权用户的编号。此外,您的代码会删除存储电话号码的变量的内容。我在回答中使用了硬编码的电话号码,这样就不会依赖于我们看不到其值的变量。我的答案中的代码删除了与电话号码匹配的
/customers
下的直接子节点。如果它为您做了其他事情,请使用复制该问题的最小代码更新您的问题。看起来我想做的事情不会在firebaseDatabase中实现,我想使用firestore,请不要告诉我如何将我的代码改编为firestore?在firestore中删除数据与在实时数据库中删除数据没有明显区别。此外,您还需要运行查询以确定要删除的文档的完整路径。我很确定我共享的代码是您需要做的,因此,如果您在实现它时遇到问题,请更新您的问题,以包括您根据我的答案尝试的内容。您的代码似乎工作正常,但它会将应用程序中的电话号码删除到。请告诉我如何在删除之前复制它(对象,而不是指向它的链接),或者如何从currentUser FirebaseUser获取电话号码,我尝试了不同的方法,但没有成功