我目前在Firebase for iOS中学习绳索,所以我的新手技能很差。
以下是我的数据库的截图:
gZ7dn2LMkiah
是用户的autoId
LDBTRFVS8dtz
和LDBTe4oXs
是此用户的childId的autoId
如何读取节点gZ7dn2LMkiah
内的两个子节点?因为我的代码如下,只有在这个节点下面只有一个孩子而不是两个
ref = Database.database().reference()
let userId: String = (Auth.auth().currentUser?.uid)!
databaseHandle = ref?.child("childId").child(userId).observe(.childAdded, with: { (snapshot) in
我尝试在childByAutoId
之后添加child(userId)
,但它没有返回任何结果。
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:2)
Database.database().reference(withPath:
"childId").child(userId).observe(.childAdded)
{ (snapshot:DataSnapshot) in
// This will print all sub node
print(snapshot)
}
答案 1 :(得分:0)
首先你的db似乎不正确。第一个节点nick and relation
位于autoGeneratedKey
内,第二个节点nick and relation
位于密钥外部,因为当节点崩溃时两者都可见。所以这些值应该在autoGeneratedKey
内。请以正确的方式更改数据库结构。见下面的截图:
这将是您的childs
表,其中包含所有父母的所有孩子,您可以查询特定的父母来获取他的孩子。请参阅下面的代码段:
ref.child("childs").queryOrdered(byChild: "parentId").queryEqual(toValue: "123").observeSingleEvent(of: DataEventType.value) { (snapshot) in
if snapshot.exists() {
print("exists")
for child in snapshot.children {
let data = child as! DataSnapshot
print(data.key)
print(data.value)
}
}
else {
print("doesn't exist")
}
}
<强>输出:强>
-LDBus9Xas3oTccwPN4r
Optional({
nick = Dave;
parentId = 123;
relation = Son;
})
-LDBus9_Uz_qe69e9CXK
Optional({
nick = Susan;
parentId = 123;
relation = Daughter;
})
parentId
为let userId: String = (Auth.auth().currentUser?.uid)!
。
注1:我尝试在childByAutoId
之后添加child(userId)
,但未返回任何结果。
是的,它不起作用,因为childByAutoId
生成一个永远不会与现有数据库密钥匹配的新密钥,因此您什么也得不到。
注2:何时使用.childAdded
.childAdded
事件是监听节点引用的新条目,而不是获取数据。要获取一次数据,我们应该使用.observeSingleEvent
事件。
注意3:由于我的代码如下,只有在此节点下只有一个孩子,而不是两个
时,才能实现不可能。这只是因为第二个节点的nick
和relation
位于密钥之外。