你好,我想删除我在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]
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()
}
}
问题中的代码实际上不会从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()