如何使用tableView单元格SWIFT删除firebase
嗨,我正试图删除我在firebase上使用siwft制作的一篇测试文章,但我使用的代码删除了所有文章,我只想删除选中的一篇文章。在下面的图片中,我想删除红色箭头具体指向的位置 此代码显示它如何存储到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()
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()