Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 值存在时Firebase快照等于null_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Swift 值存在时Firebase快照等于null

Swift 值存在时Firebase快照等于null,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,基本上我是在查询某个帖子的评论。因此,我首先在数据库中查询帖子(key)及其对应的所有数据。。这又包括一个ReviewID的ID列表,这些ID可以在我的数据库图片中看到。所有这些我都获得了成功,问题是当我需要从firebase引入审查数据时,它告诉我快照为空。。。。我读过一些东西,我相信这可能与能够在查询中进行查询有关。。谁能帮忙解释一下这件事。我不知道该怎么做,因为获取相应的评论依赖于AddPost节点中的数据(这样做是为了数据不会嵌套!) //在这里投递 func getPost(wit

基本上我是在查询某个帖子的评论。因此,我首先在数据库中查询帖子(key)及其对应的所有数据。。这又包括一个ReviewID的ID列表,这些ID可以在我的数据库图片中看到。所有这些我都获得了成功,问题是当我需要从firebase引入审查数据时,它告诉我快照为空。。。。我读过一些东西,我相信这可能与能够在查询中进行查询有关。。谁能帮忙解释一下这件事。我不知道该怎么做,因为获取相应的评论依赖于AddPost节点中的数据(这样做是为了数据不会嵌套!)

//在这里投递

  func getPost(withKey key: String, completion: @escaping (_ addPost: AddPost?) - 
 > ()) {
 REF_ADDS.child(key).observeSingleEvent(of: .value, with: { (snapshot) in
        if let snapshot = snapshot.value as? Dictionary<String,AnyObject> {
            let addPost = AddPost(postKeyId: key, postData: snapshot)

            let reviewKeys = addPost.reviewIDs
            print("\(reviewKeys)")

           // Having Issues Here. am successfully getting the keys above^
            for key in reviewKeys {
                self.getReview(withKey: key, completion: { (reviews) in
                })               
            }           
            completion(addPost)           
        }
    })   
}

代码可能还有其他问题,但我建议采用不同的方法。与其在每个帖子的评论中进行严格的循环阅读,不如在每个评论中包含帖子id,然后通过一个简单的查询来阅读它们

Posts
  "post_id_0" : { //childByAutoId()
      "endTime" : "05:32 PM 27/07/2018",
      "imageUrl" : "",
      "live" : true,
      "locationName" : "",
      "postTitle" : "hahahahaha ",
      "reviews" : {
        "review_id_0" : true,
        "review_id_1" : true
      },
      "startTime" : "04:32 PM 27/07/2018",
      "views" : 0

ReviewPost
    "review_id_0" : { //childByAutoId()
      "post_id": "post_id_0", //a reference to the post
      "addPostID" : "-LIQ_Aa8s1H067wFeCdR",
      "rating" : 5,
      "reviewComment" : "Dumplings were rubbish.",
      "time" : "2018-08-28 04:58:18 +0000",
      "userID" : "LUtRmkAefPNsRjPni5Dn0KAvKBx1"
    },
然后获取post_id_0的所有评论

let reviewPostRef = self.ref.child("ReviewPost")
let query = reviewPostRef.queryOrdered(byChild: "post_id").queryEqual(toValue: "post_id_0")
query.observeSingleEvent(of: .value, with: { snapshot in
    for child in snapshot.children {
        let childSnap = child as! DataSnapshot
        let dict = childSnap.value as! [String: Any]
        let comment = dict["reviewComment"] as! String
        print(comment)
    }
})
输出是

Dumplings were rubbish.

请将您的数据结构包含为文本而不是图像。不确定这是一个非常大的数据库。。它的内容也与屏幕截图相同。@Tasha您的问题中包含了JSON树的图片。请将其替换为实际的JSON文本,您可以通过单击中的导出JSON链接轻松获取。将JSON作为文本使其具有可搜索性,使我们能够轻松地使用它来测试您的实际数据,并在我们的答案中使用它,这通常是一件好事。@FrankvanPuffelen数据库相当大,但我已将其包含在编辑中,再次感谢您的帮助;您不是在查询中查询。您正在观察节点以获取子节点密钥。然后迭代这些子节点以获取帖子。实际上,这种技术没有什么问题,尽管将观测放在这样一个紧密的循环中可能不是最好的主意。此外,如果您确实使用了查询,那么嵌套它们也没有问题。最后,你的结构不是太深,也没有什么问题,只是问题太多了!一个片段就足够了。但是……非常感谢@Jay,我仍然不确定为什么我的另一种方法不起作用,但是你建议的方法很有魅力,我不需要改变任何数据模型或结构:D做得好
let reviewPostRef = self.ref.child("ReviewPost")
let query = reviewPostRef.queryOrdered(byChild: "post_id").queryEqual(toValue: "post_id_0")
query.observeSingleEvent(of: .value, with: { snapshot in
    for child in snapshot.children {
        let childSnap = child as! DataSnapshot
        let dict = childSnap.value as! [String: Any]
        let comment = dict["reviewComment"] as! String
        print(comment)
    }
})
Dumplings were rubbish.