我的数据库的值如下所示:
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值?
答案 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)
}
}
另见: