Firebase数据库读取childByAutoId

时间:2018-05-23 10:29:18

标签: ios swift firebase firebase-realtime-database

我目前在Firebase for iOS中学习绳索,所以我的新手技能很差。

以下是我的数据库的截图:

gZ7dn2LMkiah是用户的autoId LDBTRFVS8dtzLDBTe4oXs是此用户的childId的autoId

enter image description here

如何读取节点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),但它没有返回任何结果。

任何帮助将不胜感激。提前谢谢。

2 个答案:

答案 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内。请以正确的方式更改数据库结构。见下面的截图:

enter image description here

这将是您的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;
})

parentIdlet userId: String = (Auth.auth().currentUser?.uid)!

注1:我尝试在childByAutoId之后添加child(userId),但未返回任何结果。

是的,它不起作用,因为childByAutoId生成一个永远不会与现有数据库密钥匹配的新密钥,因此您什么也得不到。

注2:何时使用.childAdded

.childAdded事件是监听节点引用的新条目,而不是获取数据。要获取一次数据,我们应该使用.observeSingleEvent事件。

注意3:由于我的代码如下,只有在此节点下只有一个孩子,而不是两个

时,才能实现

不可能。这只是因为第二个节点的nickrelation位于密钥之外。