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