无法从数据库(FIREBASE / IOS)中检索注释

时间:2019-03-14 03:47:13

标签: ios swift firebase firebase-realtime-database

此刻我有点扑朔迷离,因为我似乎无法弄清楚我的代码没有正确地从数据库中加载评论的原因,它正在接收来自ID的帖子的每个评论的ID。数据库(post_comments),但无法检索任何数据?

    func loadComments() {
    let postCommentRef = Database.database().reference().child("post_comments").child("6AECB02A-CC97-4ECB-8A09-702E254D4CCD")
    postCommentRef.observe(.childAdded, with: {
        snapshot in
        print("snapshot key")
        print(snapshot.key)
        Database.database().reference().child("comments").child(snapshot.key).observeSingleEvent(of: .value, with: {
            snapshotComment in
            //print(snapshotComment.value!)
            if let dict = snapshotComment.value as? [String : Any] {
                let newComment = Comment().transformComment(dict: dict)
                self.fetchUser(uid: newComment.uid!, completed: {
                    self.comments.append(newComment)
                    self.tableView.reloadData()
                    print(newComment) <- trying to retrive data, I've posted below what the output of this is.
                })
                //let photoUrlString = dict["photoUrl"] as! String
            }
            })
    })
}

在我的代码中,您可以看到我放置了一个小的打印功能,以查看代码吐出的数据,这是调试日志的输出。

snapshot key
L_sWOp0w1V8DaGSK7iK
snapshot key
L_sWQI70PogYAtwjla4
snapshot key
hello <-- this is a test uid I created in the DB, treat it like any other key listed above.

如您所见,loadComments()函数的结果并没有太大作用。

我不确定是否需要它,但以防万一它可以帮助我拍摄了数据库的屏幕快照,以显示其在下面的实际外观。

Database

如果需要进一步的信息,请询问,我会提供的,我只提供了我认为必要的信息,并且我可以肯定这是由于我从数据库中检索数据的原因。< / p>

编辑

经过一番尝试后,我设法从第二个数据库调用中获得了某种输出,该调用检索了注释数据库中的键,该键与后注释数据库中的键相同,但是该值返回null

    func loadComments() {
    let postCommentRef = Database.database().reference().child("post_comments").child("6AECB02A-CC97-4ECB-8A09-702E254D4CCD")
    postCommentRef.observe(.childAdded, with: {
        snapshot in
        print(snapshot.key)
        Database.database().reference().child("comments").child(snapshot.key).observeSingleEvent(of: .value, with: { (snapshotComment) in
            print("Snapshot value")
            print(snapshotComment.value)
            print("Snapshot.key")
            print(snapshotComment.key)
            //print(snapshotComment.value!)
            //if let dict = snapshotComment.value as? [String : Any] {
            //    let newComment = Comment().transformComment(dict: dict)
            //    self.fetchUser(uid: newComment.uid!, completed: {
            //        self.comments.append(newComment)
            //        self.tableView.reloadData()
            //        print(newComment)
            //    })
                //let photoUrlString = dict["photoUrl"] as! String
            })
        })
    }

此代码的结果如下。

L_sWOp0w1V8DaGSK7iK <-- these two come from the snapshot.key for post_comments
L_sWQI70PogYAtwjla4 <---^
Snapshot value
Optional(<null>)
Snapshot.key
L_sWOp0w1V8DaGSK7iK
Snapshot value
Optional(<null>)
Snapshot.key
L_sWQI70PogYAtwjla4

我将寄予厚望,并尝试找出问题的根源,如果没有人可以提供此问题的答案,我希望能够找到一种自己解决的方法,因为我相信我尝试构建的数据库结构效率更高,并且可以提供更好的用户体验,如果我错了,我希望知道一种更好的方法:)

编辑#2

我似乎已经解决了我的问题,下面我发布了有关导致问题的方式和原因的详细说明,以及解决该问题后使用的代码

1 个答案:

答案 0 :(得分:1)

所以看来问题出在我想像中的荒诞简单,但是,在将Firebase放到我的头上之前,实际上并没有使用过Firebase,反正在Firebase控制台中查看了数据库后,我发现评论会显示出来以此https:// REDACTED / comments / -L_sWQI70PogYAtwjla4 在数据库中,仔细查看后,您可以看到注释的ID以连字符开头,但是在数据库中查看它的自身(而不查看URL)实际上并不能揭示这一点,因此,我设法解决了此问题大约4个字符,如下所示

Database.database().reference().child("comments").child("-" + snapshot.key).observeSingleEvent(of: .value, with: {

您可以看到我说的4个字符是“-” = ,它将连字符添加到数据库查询中并返回正确的值;我不确定这是否是最好的方法,但它是否有效,所以我很高兴!

这是我所有的大惊小怪的代码,希望以后遇到相同问题的人能够找到这个问题,而不必经历我所拥有的...

    func loadComments() {
    let postCommentRef = Database.database().reference().child("post_comments").child("6AECB02A-CC97-4ECB-8A09-702E254D4CCD")
    postCommentRef.observe(.childAdded, with: {
        snapshot in
        print("snapshot key")
        print(snapshot.key)
        Database.database().reference().child("comments").child("-" + snapshot.key).observeSingleEvent(of: .value, with: {
            snapshotComment in
            //print(snapshotComment.value!)
            if let dict = snapshotComment.value as? [String : Any] {
                let newComment = Comment().transformComment(dict: dict)
                self.fetchUser(uid: newComment.uid!, completed: {
                    self.comments.append(newComment)
                    self.tableView.reloadData()
                    print(newComment)
                })
                //let photoUrlString = dict["photoUrl"] as! String
            }
        })
    })
}