在Swift 5.0中从Firebase实时数据库中检索特定数据

时间:2019-05-23 05:35:19

标签: ios swift firebase firebase-realtime-database

我在 firebase 上并不出色,但是我正在开发一个项目,用于升级聊天应用程序。我在其中创建包含成员的组的内部创建了一个非节点 GroupChat 。现在,我想检查子元素节点中的 userid 是否可用,例如 UserInfo / userid 。通过观察下面的结构,您可以了解一些想法。任何帮助都将不胜感激。 enter image description here

这是我的代码,用于检索特定值的数据。

let questionPostsRef = Database.database().reference().child("GroupChat")
let query = questionPostsRef.queryOrdered(byChild: "UserInfo/userid").queryEqual(toValue: FireStoreApp.shared.objUser.strUserID)// Here i pass userid that i want to check in firebase.
 query.observeSingleEvent(of: .childAdded, with: { snapshot in

         print(snapshot.value)
         if !snapshot.exists() { return }
         for child in snapshot.children {
                let childSnap = child as! DataSnapshot
                let dict = childSnap.value as! [String: Any]
                print(dict)
         }
 })

提前感谢您的宝贵时间

2 个答案:

答案 0 :(得分:0)

尝试以下操作:

#version 460 core

您需要从上到下遍历数据库,因此需要添加子项let questionPostsRef = Database.database().reference().child("GroupChat").child("LfY0_k5TakQ1EuPiGQU").child("UserInfo"); let query = questionPostsRef.queryOrdered(byChild:"userid").queryEqual(toValue: FireStoreApp.shared.objUser.strUserID)// Here i pass userid that i want to check in firebase. query.observeSingleEvent(of: .value, with: { snapshot in print(snapshot.value) if !snapshot.exists() { return } for child in snapshot.children { let childSnap = child as! DataSnapshot let dict = childSnap.value as! [String: Any] print(dict) } }) ,然后才能检查child("LfY0_k5TakQ1EuPiGQU")是否存在。

此外,当您要检查孩子是否存在时,需要使用.value事件而不是userId

答案 1 :(得分:0)

第一件事是这段代码...

.queryOrdered(byChild: "UserInfo/userid")

无效,因为UserInfo没有userid的直接子代。它的孩子是0、1、2等

第二件事是;通常,最好避免在NoSQL数据库中使用数组。

一种可能的解决方案是更改您的结构以匹配您要尝试的操作。

代替

GroupChat
   uid
      UserInfo
        0...
        1...
        2...

其中0、1、2是未知的...将其更改为

GroupChat
   uid
      UserInfo
        uid_x
           PhotoUrl
           username
        uid_y
           PhotoUrl
           username     
        uid_z
           PhotoUrl
           username

该结构使您很容易查看UserInfo中是否已存在一个uid,因为您将知道直接路径。它还避免了完全运行查询以节省资源(查询比直接观察者重)。这里是一些伪代码

let pathToCheck = rootRef.child("GroupChat").child(uid).child("UserInfo").child(uid_to_look_for)

然后

pathToCheck.observeSingleEvent.... { snapshot in
  if snapshot.exists() {
     // do something with the snapshot
  } else {
     print("user does not exist in group")
  }
}