如何删除firebase的tableView单元格SWIFT。

问题描述 投票:0回答:1

你好,我想删除我在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]

want to delete the red arrow, not the whole posts library

 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {



if editingStyle == .delete {
self.theposts.remove(at: indexPath.row)
    tableView.deleteRows(at: [indexPath], with: .left)
    Database.database().reference().child("posts").childByAutoId().removeValue()
}
}
swift xcode firebase uitableview firebase-realtime-database
1个回答
1
投票

问题中的代码实际上不会从post节点中删除任何东西。

Database.database().reference().child("posts").child("uid").removeValue()
                                                     ^^^^^

没有一个子节点的键是字面字符串 "uid"。

如果有一个key为 "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_0
      author: "test_0"
   post_1
      author: "test_1"
   post_2
      author: "test_3"

EDIT:

假设我想从帖子中删除post_1节点。以下是删除的方法(还有其他方法

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

编辑2:好东西

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

1) 查询节点(不推荐)使用这个选项,你需要通过一些值来查询节点。这里的关键是这个值必须存在于节点中。所以在我上面的结构中,查询的节点是author = "test_1"。这个选项的缺点是可能有多个作者 "test_1",所以这个选项有局限性。

2)推荐改变你的Swift模型,让它也存储节点键。问题中没有概述,但通常一个tableView是由一个dataSource,一个数组来支持的,这个数组中包含了与你的Firebase数据相匹配的模型。

我是用伪代码来解决这个问题,因为问题中的代码不够,不知道具体的情况。

在这种情况下,似乎是一个帖子的列表,所以模型应该是

class PostClass {
   var post_id = ""
   var post_text = ""
   var author_uid = ""
   var photo_url = ""
}

然后用dataSource数组来存储它

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)
}

所以现在每个节点的所有数据都被存储起来了,当需要删除的时候,只需要从dataSource中读取该对象,获取post_id,然后删除即可。

let post = self.postArray[index of row to delete]
let postId = post.post_id

Database.database().reference().child("posts").child(postId).removeValue()
© www.soinside.com 2019 - 2024. All rights reserved.