2016-12-23 116 views
1

我的数据库有排序是这样的值:通过儿童搜索值火力地堡/斯威夫特

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值了字典?

回答

1

当您执行对火力地堡数据库查询的情况下,可能会有多个结果。所以快照包含了这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。

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) 
    } 
} 

另见:

1

尝试......

假设的结构(这是斯威夫特2,火力地堡2)

users 
    uid_0 
    email: "[email protected]" 
    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!) 
} 

一对夫妇的事情注意

的“字典”变量被告知它被指定类型的字典[海峡ing:Anyobject]。

任何对象很可能,是任何对象。一个字符串,另一个字典,一个int。所以,你需要确保你的代码可以处理任何对象是

在这种情况下,快照关键是该用户的快照,关键要有父节点,在这种情况下是uid_0。所以输出

[email protected] 
some display name 
uid_0 

编辑:

更新了火力地堡4,雨燕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) 
    } 
}) 
+0

这是行不通的。没关系,如果你有一个单独的记录。如果您有uid_0和uid_1,并且您正在查找的电子邮件位于uid_1中,您将如何找到它?这些uid是自动生成的,因此您不知道它们,但需要搜索孩子以查找电子邮件并返回记录 – justdan0227

+0

@ justdan0227它确实有用!代码已经过测试。但是,您*用例*与问题中的内容不同。 OP询问如何在找到节点时获取UID,并且我的代码解决了如何获取该UID(这是快照?.key),假设每个节点都有一个谨慎的用户名和电子邮件。我的代码做到了。但是,如果可能有多个结果,则查询将返回包含所有匹配节点的快照。然后你会迭代快照来获得有关uid的信息 - 请参阅Frank对此例子的回答。 – Jay

+0

对不起@Jay,我认为最初的问题是“如何用用户名/电子邮件查找用户字典后,如何从字典中获取UID值?”这意味着你必须首先根据用户名/电子邮件找到“记录”,然后返回UID。 – justdan0227