如何使用tableView单元格SWIFT删除firebase

如何使用tableView单元格SWIFT删除firebase,swift,xcode,firebase,uitableview,firebase-realtime-database,Swift,Xcode,Firebase,Uitableview,Firebase Realtime Database,嗨,我正试图删除我在firebase上使用siwft制作的一篇测试文章,但我使用的代码删除了所有文章,我只想删除选中的一篇文章。在下面的图片中,我想删除红色箭头具体指向的位置 此代码显示它如何存储到Firebase guard let prof = uServe.currentUserProfile else {return} let postRef = Database.database().reference().child("posts").childByAutoId()

嗨,我正试图删除我在firebase上使用siwft制作的一篇测试文章,但我使用的代码删除了所有文章,我只想删除选中的一篇文章。在下面的图片中,我想删除红色箭头具体指向的位置

此代码显示它如何存储到Firebase

guard let prof = uServe.currentUserProfile else {return}

    let postRef = Database.database().reference().child("posts").childByAutoId()

    let pObj = [
        "author": [

            "uid": prof.uid,
            "name": prof.name,
            "photo": prof.photo.absoluteString

              ],
      "text": textView.text,
            "timestamp": [".sv":"timestamp"]
        ] as [String:Any]


问题中的代码实际上不会从posts节点删除任何内容

Database.database().reference().child("posts").child("uid").removeValue()
                                                     ^^^^^
没有具有文本字符串“uid”键的子节点

如果存在键为“uid”的子节点,则只删除该子节点。比如说

posts
   post_0
      author: "test_0"
   post_1
      author: "test_1"
   uid
      author: "test_2"
   post_2
      author: "test_3"
如果结构是这样的,并且代码已经运行,那么它将删除键为“uid”的节点

编辑:

假设我想从posts中删除post_1节点。下面是如何做到这一点(还有其他方法)

编辑2:好东西

根据评论,实际问题是OP不知道如何到达他们想要删除的特定节点。这里有两个选择

1) 查询节点(不推荐) 使用此选项,您需要按某个值查询节点。这里的关键是值必须存在于节点中。因此,在我上面的结构中,查询author=“test_1”所在的节点。这样做的缺点是可能有多个作者“test_1”,因此此选项有局限性

2) 推荐 更改Swift模型以同时存储节点密钥。问题中没有概述,但通常情况下,tableView由一个数据源、一个数组支持,该数组包含与Firebase数据匹配的模型

我用伪代码在较高的层次上解决这个问题,因为问题中没有足够的代码知道细节

在本例中,它似乎是一个帖子列表,因此可以创建一个模型

class PostClass {
   var post_id = ""
   var post_text = ""
   var author_uid = ""
   var photo_url = ""
}
然后使用数据源数组来存储它

var postsArray = [PostClass]()
然后在读取Firebase时,创建对象并将密钥与数据一起存储在每个对象中

postsNode.observe.... { snapshot in
   let post = PostClass()
   post.post_id = snapshot.key  //<-  this is the important part
   post.post_text = snapshot.childSnapshot("post_text") as? String ?? "No Text"
....
   self.postArray.append(post)
}

我应该提到,它们是用childByAutoID()安排的。如果你能看到的话,我已经添加了代码存储在问题信息中的方式。@UsmaanMahmood谢谢,我从结构上理解了这一点。我的回答仍然解决了核心问题,因为您试图删除一个键为文本字符串“uid”的节点,而该节点不存在。即使它这样做了(如我的回答所示),它也不会删除其他节点——它只会删除带有字符串“uid”键的节点。那么还有其他方法吗?@UsmaanMahmood其他方法做什么?您正试图删除一个不存在的节点。如果要删除特定节点,则需要使用要删除的节点的键。我在我的答案中添加了一个编辑,看一看。我明白你的意思,而且放uid显然不起作用。我想问的是,我可以使用什么代码来代替m,以便我可以为特定帖子选择childAutoId创建的id?因为你留下来,除非我有一个特定的孩子的名字,否则我不能做这件事。我编辑的内容是否更接近我想要实现的目标?
class PostClass {
   var post_id = ""
   var post_text = ""
   var author_uid = ""
   var photo_url = ""
}
var postsArray = [PostClass]()
postsNode.observe.... { snapshot in
   let post = PostClass()
   post.post_id = snapshot.key  //<-  this is the important part
   post.post_text = snapshot.childSnapshot("post_text") as? String ?? "No Text"
....
   self.postArray.append(post)
}
let post = self.postArray[index of row to delete]
let postId = post.post_id

Database.database().reference().child("posts").child(postId).removeValue()