我正在尝试访问嵌套的Firebase数据库,尤其是在自动ID下访问Rating的子级,但是如何正确访问它? JSON
结构如下:
users
Q6jYe9gzAePy8x6SJulTYLMQTpN2
Fname: Mark Jed
Lname: Venge
Rating:
18e85e0a-9b91-4cb1-a743-792212f1925f
Rating: 3
User: k8rn16AAXbTLSyvinD92CugMbL53
这是代码段:
for child in snapshot.childSnapshot(forPath: "Rating").children{
let child = child as! DataSnapshot
for ratings in child.children{
let valueSnap = ratings as! DataSnapshot
let dict = valueSnap.value! as! [String:Any]
}
}
问题是“ dict”的错误为
无法将类型'__NSCFNumber'(0x116e337d8)的值强制转换为'NSDictionary'(0x116e34818)。
答案 0 :(得分:0)
您在snapshot.children
上有两个嵌套循环,这似乎太多了。
您似乎是从为用户创建快照开始,然后遍历其Rating
属性的子级。
for child in snapshot.childSnapshot(forPath: "Rating").children{
因此,在此循环中,child
快照是指以下内容:
Rating: 3
User: k8rn16AAXbTLSyvinD92CugMbL53
然后,您再次遍历这些孩子,并尝试将每个孩子读为[String:Any]
。这是行不通的,因为这里的每个属性都是一个值。而且由于您无法将3
投射到[String:Any]
,因此应用程序崩溃了。
有两种选择:
删除内部循环:
for child in snapshot.childSnapshot(forPath: "Rating").children{
let child = child as! DataSnapshot
let dict = child.value! as! [String:Any]
}
不要强制转换为[String:Any]
,而只需获取简单的值即可:
for child in snapshot.childSnapshot(forPath: "Rating").children{
let child = child as! DataSnapshot
for ratings in child.children{
let valueSnap = ratings as! DataSnapshot
let value = valueSnap.value! as! Any
}
}
修改
为避免“ Any”,以下代码将直接获取每个子节点的等级和用户值。
let ratingsRef = self.ref.child("users").child("the user id")
ratingsRef.observeSingleEvent(of: .value, with: { snapshot in
let allRatingsSnap = snapshot.childSnapshot(forPath: "Rating")
for ratingSnap in allRatingsSnap.children.allObjects as! [DataSnapshot] {
let rating = ratingSnap.childSnapshot(forPath: "Rating").value ?? "no rating"
let uid = ratingSnap.childSnapshot(forPath: "User").value ?? "no user"
print("user uid: \(uid) rating: \(rating)")
}
})
和输出
user uid: uid_1 rating: 3
user uid: uid_2 rating: 2