在Firebase Swift中删除特定的子节点

时间:2018-10-07 12:48:13

标签: swift firebase firebase-realtime-database

您能帮我解决这个问题吗?我想删除数据库中的特定消息。

我的数据库如下:

• MESSAGES  
 ••(childByAutoID XXXXXXXXX)  
  •••email: user1@gmail.com  
  •••message: hello there  
  •••timestamp: 329842938592  
•  
 ••(childByAutoID XXXXXXXXX)  
  •••email: user1@gmail.com  
  •••message: where are you?  
  •••timestamp: 872985042750  
•  
 ••(childByAutoID XXXXXXXXX)  
  •••email: user2@gmail.com  
  •••message: basketball?  
  •••timestamp: 845938459349

我尝试使用此代码,但它从当前用户(user1)删除了错误的帖子。

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {


    if (editingStyle == .delete) {
        jobRequests.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .automatic)

        if let email = Auth.auth().currentUser?.email {

            Database.database().reference().child("MESSAGES").queryOrdered(byChild: "email").queryEqual(toValue: email).observeSingleEvent(of: .childAdded, with: { (snapshot) in

               snapshot.ref.removeValue()

那么我该如何删除消息“你在哪里?”及其成员。

enter image description here

1 个答案:

答案 0 :(得分:1)

查询需要匹配您要删除的内容。

如果要删除文本为person的消息,则应查询以下内容:

"where are you?"

如果要删除所有包含特定电子邮件的邮件,则应进行查询:

let messagesRef = Database.database().reference().child("MESSAGES")

messagesRef.queryOrdered(byChild: "message").queryEqual(toValue: "where are you?")...

如果要删除特定消息,则必须知道其密钥,然后:

messagesRef.queryOrdered(byChild: "email").queryEqual(toValue: "email1@gmail.com")...

或更惯用的:

messagesRef.queryOrderedByKey().queryEqual(toValue: "-L....")...

(请注意,由于我们不再使用查询,因此此处观察的是messagesRef.child("-L....").observeSingleEvent(of: .value, with: { (snapshot) in snapshot.ref.removeValue() ,而不是value

或更简单;由于您已经知道要删除的节点的完整路径,因此您无需读取任何内容:

.childAdded