我在firebase中的结构如下:
app name
user ID
wins = 7
losses = 8
和我读取wins子节点的代码
ref = Database.database().reference().child(passUserID)
ref?.child("wins").observe(.childAdded, with: { (snapshot) in
//Convert the info of the data into a string variable
let getData = snapshot.value as? String
print(getData)
})
但是它什么也不打印。
要从Firebase读取数据,请将侦听器附加到创建FIRDatabase引用的路径上。FIRDatabaseReference表示Firebase数据库中的某个特定位置,在该位置上有一个子项的键值对列表。因此,在您的情况下,您已创建了一个对键“ wins”的Firebase引用,该引用仅指向一个值,而不是键-值对。到目前为止,您的参考是有效的:
ref = Database.database().reference().child(passUserID)
//did you mean FIRDatabase and not Database??
此FIRDatabaseReference指向密钥passUserID,该密钥具有子项[“ wins”:“ 7”]和[“ loss”:“ 8”]的键值对列表(注意:密钥始终是字符串)。因此,从您的FIRDatabase参考中,您可以如下创建观察者,并读取“ wins”的值:
ref?.observe(.childAdded, with: { (snapshot) in
//Convert the info of the data into a string variable
if let getData = snapshot.value as? [String:Any] {
print(getData)
let wins = getData["wins"] as? String
print("\(wins)")
}
})
添加儿童的事件将针对每个现有数据触发一次,快照值将是单个记录,而不是像value事件那样获得的整个列表。随着更多物品的进入,此事件将与每个物品一起触发。因此,如果“损失”是第一条记录,则您可能不会获得“胜利”的价值。这是您要达到的目标吗?如果您真正想知道的是该特定位置的“ wins”值,并且要知道该值是否发生过更改,则应使用.value观察器,如下所示:
ref?.observe(.value, with: { (snapshot) in
//Convert the info of the data into a string variable
if let getData = snapshot.value as? [String:Any] {
let wins = getData["wins"] as? String
print("\(wins)") //check the value of wins is correct
}
})
或者,如果您只是想一次了解获胜的价值,而又不担心知道是否有任何变化,请使用“ observeSingleEvent”而不是“ observe”。
编辑
我看到了您的图像,现在意识到您的参考文献也可能有问题。您的参考实际上应该是这样的:
ref = FIRDatabase.database().reference().child("game-").child(passUserID)
您已经模糊了“游戏”是什么,但是对“胜利”的有效引用将包括在内。
第二编辑
我将添加以下内容,以便您可以正确调试问题。使用此模式观察值,看看是否返回错误,内容如下:
ref.observe(.value, with: { (snapshot) in
print(snapshot)
}, withCancel: { (error) in
print(error.localizedDescription)
})
如果由于数据库规则而无法访问该Firebase位置,通常会给您一个错误。看看print(snapshot)是否返回上述任何内容也是一个好主意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句