【问题标题】:Firebase Database Read childByAutoIdFirebase 数据库读取 childByAutoId
【发布时间】:2018-05-23 20:49:36
【问题描述】:

我目前在 iOS 的 Firebase 中学习绳索,所以我的新手技能非常简单。

下面是我的数据库截图:

gZ7dn2LMkiah 是一个用户的 autoId
LDBTRFVS8dtzLDBTe4oXs 是这个用户的 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


我尝试在child(userId) 之后添加childByAutoId,但没有返回任何结果。

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

【问题讨论】:

  • 您的数据库似乎不正确。在第一个节点中,自动键内的尼克和关系以及在第二个节点中,键外的尼克和关系在节点折叠时都是可见的。虽然我只是评论,但不要拒绝投票。
  • 感谢您发现这一点。但它很奇怪,我的数据库不像图像那样显示它!我会尝试重新上传图片,看看它是否正确显示。
  • gZ7dn2LMkiah 是你的 userId 吗?我的意思是userId == gZ7dn2LMkiah ?

标签: ios swift firebase firebase-realtime-database


【解决方案1】:
Database.database().reference(withPath: 
 "childId").child(userId).observe(.childAdded)
   { (snapshot:DataSnapshot) in    
       // This will print all sub node  
      print(snapshot)
   }

【讨论】:

  • 告诉我这是否有用
  • Nopes :( 我用你的代码替换了我的代码,但它仍然没有获取任何结果。同样,如果我删除节点并使其成为单个节点,它会获取结果。但我的解决方案需要一个密钥对于每个孩子,因此是第二层。
  • 谢谢@Jignesh。它起作用了,正确的数据被提取到控制台中。现在,现在我需要将这些数据转换为我的 tableView。你有关于如何做的教程吗?再次感谢。
  • 很容易将这些数据添加到数组中并重新加载您的表格
【解决方案2】:

首先,您的数据库似乎不正确。在第一个节点中 nick and relationautoGeneratedKey 内,在第二个节点中 nick and relation 在键之外,因为在节点折叠时两者都是可见的。所以这些值应该在autoGeneratedKey 内。请以正确的方式更改您的数据库结构。看下面的截图:

这将是您的childs 表,其中包含所有父母的所有孩子,您可以查询特定父母以获取他的孩子。见下面代码sn-p:

 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:我尝试在 child(userId) 之后添加 childByAutoId,但没有返回任何结果。

是的,它不会起作用,因为childByAutoId 会生成一个永远不会与现有数据库密钥匹配的新密钥,因此您将一无所获。

注意2:何时使用.childAdded

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

注意 3:由于我下面的代码,只有在此节点下只有一个子节点而不是两个子节点时才有可能

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

【讨论】:

  • 谢谢。我不确定图像是如何变成的。我的数据库正确显示节点。我会重新上传图片。其次,“child as!DataSnapshot”,当我收到“未解决”错误时,您在哪里解决了“child”标识符。再次感谢您的意见
  • 让 userId: String = (Auth.auth().currentUser?.uid)!
  • 这完全等于gZ7dn2LMkiah 或者这只是一个自动生成的密钥?
  • 要解决该错误,您需要import FirebaseDatabase
  • 它是一个自动生成的密钥。是的,我已经导入了 firebasedatabase 以及它的参考
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多