搜索子值Firebase / Swift

时间:2016-12-23 21:04:32

标签: ios swift firebase firebase-realtime-database

我的数据库的值如下所示:

 Users
    UID
      Username
      Email

我想要实现一个朋友添加系统,您可以在其中搜索用户名或电子邮件,并允许您添加此人。

我可以使用

找到用户
 REF_USERS.queryOrdered(byChild: "displayname").queryEqual(toValue: input).observeSingleEvent(of: .value) { (snapshot: FIRDataSnapshot) in {
 print(snapshot.value)
}

有了这个,我得到了用户的整个字典,但我抓住了UID的问题。

snapshot.key为我提供了"用户"。

如何在找到用户名/电子邮件的用户词典后,如何从字典中获取UID值?

2 个答案:

答案 0 :(得分:2)

试试这个......

假设一个结构(这是Swift 2,Firebase 2)

users
  uid_0
    email: "someuser@thing.com"
    displayName: "some display name"

我们希望得到uid_0的信息

let displayName = "some display name"

usersRef.queryOrdered(byChild: "displayName").queryEqual(toValue: displayName)
              .observeSingleEvent(of: .childAdded) { (snapshot: FIRDataSnapshot) in {

     let dict = snapshot?.value as! [String: AnyObject]
     let email = dict["email"]
     let displayName = dict["displayName"]
     print(email!)
     print(displayName!)

     let key = snapshot?.key
     print(key!)
}

有几点需要注意

'dict'变量被告知它被分配了一个[String:Anyobject]类型的字典。

任何对象都可以,任何对象。一个字符串,另一个字典,一个int。因此,您需要确保代码可以处理任何对象

此情况下的快照键是此用户的快照,密钥必须是父节点,在本例中为uid_0。所以输出是

someuser@thing.com
some display name
uid_0

编辑:

针对Firebase 4,Swift 4进行了更新,并处理了返回多个孩子的情况

let usersRef = self.ref.child("users")

let input = "some display name"
let query = usersRef.queryOrdered(byChild: "displayName").queryEqual(toValue: input)
query.observeSingleEvent(of: .value, with: { snapshot in
    for child in snapshot.children {
        let snap = child as! DataSnapshot
        let dict = snap.value as! [String: Any]
        let email = dict["email"] as! String
        let displayName = dict["displayName"] as! String
        print(email)
        print(displayName)

        let key = snapshot.key
        print(key)
    }
})

答案 1 :(得分:1)

对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

let query = REF_USERS.queryOrdered(byChild: "displayname").queryEqual(toValue: input)
query.observeSingleEvent(of: .value) { (snapshot: FIRDataSnapshot) in {
    for child in snapshot.children {
        print(child.key)
    }
}

另见: