Ios 如何检索autoId以删除值
我试图允许用户在按下删除按钮后删除评论。提交评论时,它们是使用autoId创建的,节点的标题将是postId,以查看他们对什么帖子发表了评论Ios 如何检索autoId以删除值,ios,swift,firebase-realtime-database,Ios,Swift,Firebase Realtime Database,我试图允许用户在按下删除按钮后删除评论。提交评论时,它们是使用autoId创建的,节点的标题将是postId,以查看他们对什么帖子发表了评论 "comments" : { "-LmfZZis5ovtBwfm_4xR" : { "-LoHu5Qv3BmuHTsSlthj" : { "creationDate" : 1.567980283717026E9, "text" : "Kkkk", "uid" : "64r3dgTN6x
"comments" : {
"-LmfZZis5ovtBwfm_4xR" : {
"-LoHu5Qv3BmuHTsSlthj" : {
"creationDate" : 1.567980283717026E9,
"text" : "Kkkk",
"uid" : "64r3dgTN6xMhHYhptFlsFWX0dLk2"
},
"-LoHuPohuQ3eUtDWL_G-" : {
"creationDate" : 1.567980367209054E9,
"text" : " Ok",
"uid" : "64r3dgTN6xMhHYhptFlsFWX0dLk2"
}
}
},
我不知道如何检索autoId,以便当前登录的用户可以删除他们的评论。这是提交代码
func didSubmit(注释:字符串){
guard let uid=Auth.Auth().currentUser?.uid else{return}
打印(“帖子id:,self.post?.posted??”)
打印(“插入注释:”,注释)
设postId=self.post?.postId??“”
将值=[“text”:注释,“creationDate”:Date().timeIntervalSince1970,“uid”:uid]设为[字符串:任意]
Database.Database().reference().child(“comments”).child(postId).childByAutoId().updateChildValue(values){(err,ref)中的
如果让err=err{
打印(“插入注释失败:”,错误)
返回
}
self.uploadCommentNotificationToServer()
if comment.contains(“@”){
self.uploadInetitionNotification(forPostId:postId,withText:comment,isForComment:true)
}
self.containerView.clearCommentTextView()
}
}
注释结构
结构注释{
var-commentId:String!
让用户:用户
var creationDate:日期!
让文本:字符串
让我们看看字符串!
init(commentId:String!,user:user,dictionary:[String:Any]){
self.commentId=commentId
self.user=用户
self.text=字典[“文本”]作为?字符串??“
self.uid=字典[“uid”]作为字符串??“
如果让creationDate=字典[“creationDate”]作为?双精度{
self.creationDate=日期(时间间隔自1970年起:creationDate)
}
}
var post:post?
func deleteComment(){
guard let postId=self.post?.postId else{return}
让commentsRef=Database.Database().reference().child(“注释”)
commentsRef.child(postId.child(commentId.removeValue)()
}
}
获取注释的代码
var comments=[Comment]()
func fetchComments(){
guard let postId=self.post?.postId else{return}
设ref=Database.Database().reference().child(“注释”).child(postId)
添加了ref.observe(.child),并在中添加:{(快照)
让commentId=snapshot.key
guard let dictionary=snapshot.value as?[String:Any]else{return}
guard let uid=字典[“uid”]as?字符串else{return}
Database.fetchUserWithUID(with:uid,completion:{(user)in)
let comment=comment(commentId:commentId,user:user,dictionary:dictionary)
self.comments.append(comment)
self.collectionView?.reloadData()
})
}){(错误)在
打印(“未能观察评论”)
}
}
谢谢 要删除节点,必须知道该节点的完整路径 有两种方法可以知道要删除的产品的密钥:
let postId = "-LmfZZis5ovtBwfm_4xR"
let commentId = "-LoHu5Qv3BmuHTsSlthj"
let commentsRef = Database.database().reference().child("comments")
commentsRef.child(postId).child(commentId).removeValue()
;您的问题中包含了JSON树的图片。请将其替换为实际的JSON文本,您可以通过单击溢出菜单中的导出JSON链接轻松获得该文本(⠇) 当然。将JSON作为文本使其可搜索,允许我们轻松使用它来测试您的实际数据,并在我们的答案中使用它,总体而言,这对doThanks Frank来说是一件好事,将编辑问题Hi Frank,感谢您如此快速地回答。当我收到多个带有不同ID的评论时,我如何准确地获取密钥?如果您是在你的回答中已经解释过了,我很抱歉,只是有点困惑。难道不能让autoId等于第二个Id,postId等于第一个Id吗?或者我必须让
let firstId=postId
和let secondId=
自动Id是什么意思吗?我不确定你帖子中的两个自动Id级别是什么意思,这是什么意思我将它们命名为firstId
和secondId
。我现在看到它们是postId
和commentId
,因此更新了我的答案。无论哪种方式,您都需要知道这两个键才能删除特定的注释。我答案中的方法1意味着您需要在从t加载数据时传递这两个键数据库,很遗憾你没有在你的问题中显示。我明白了。我将编辑我的问题,在我的问题中包括我用来获取数据的代码。谢谢Frank!我希望这会有帮助。谢谢。在你现在获取snapshot.value
,你还需要获取snapshot.key
,并将其与注释一起存储。然后当用户点击一条评论,你知道它的关键,把它和self.post?.postd`结合起来,这样就可以在我的答案中使用代码了。