Ios 如何检索autoId以删除值

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

我试图允许用户在按下删除按钮后删除评论。提交评论时,它们是使用autoId创建的,节点的标题将是postId,以查看他们对什么帖子发表了评论

  "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`结合起来,这样就可以在我的答案中使用代码了。