Swift中的Firebase查询

时间:2016-01-19 23:06:08

标签: swift firebase

我在" / users"

中有这样的结构
{
 "aaa@aaa-com":{
     "email":"aaa@aaa.com",
     "name": "Joseph",
 },
 "asd@asd-com": {
     "email": "asd@asd.com",
     "name": "Erik"
 }
}

我查询了访问电子邮件的孩子" aaa@aaa.com" :

    usersRef.queryOrderedByChild("email").queryEqualToValue("aaa@aaa.com") .observeEventType(.Value, withBlock: { snapshot in
        if snapshot.exists() {
            print("user exists")

        } else if !snapshot.exists(){
            print("user doesn't exists")


        } 

如果我打印(快照),我在xcode中获得控制台输出:

Snap (users) {
    "aaa@aaa-com" =     {
         email = "aaa@aaa.com";
         name = "Joseph";
     };
 }

在尝试此查询后,我试图找到一些获取用户名称的方法,但我没有找到方法。 我尝试过:

    print(snapshot.value.objectForKey("name"))
    print(snapshot.value.valueForKey("name"))

但我两个都没有。

你们知道如何获得名称价值吗?

提前致谢!!

3 个答案:

答案 0 :(得分:2)

这个问题很古老,而且还有很多其他资源。希望如果你还没有到那里,这将有所帮助。

最简单的方法是将snapshot.value投射到[String: AnyObject]类型。然后,您可以访问内部节点。

usersRef.queryOrderedByChild("email")
        .queryEqualToValue("aaa@aaa.com")
        .observeEventType(.Value, withBlock: { snapshot in

    // if you know that your value will not be nil, then you can unwrap like below
    //let foo = snapshot.value as! [String: AnyObject]

    if let foo = snapshot.value as? [String: AnyObject] {
        let name = foo["name"] as? String
        let email = foo["email"] as? String
    }

} 

Swift 3

usersRef.queryOrdered(byChild: "email")
        .queryEqual(toValue: "aaa@aaa.com")
        .observe(.value, with: { snapshot in

    // if you know that your value will not be nil, then you can unwrap like below
    //let foo = snapshot.value as! [String: AnyObject]

    if let foo = snapshot.value as? [String: AnyObject] {
        let name = foo["name"] as? String
        let email = foo["email"] as? String
    }

}

根据您的查询,鉴于您在JSON树中的位置,上述内容应该适合您。

如果您在users节点的树中处于一级,并希望获得所有值,则可以像这样访问:

usersRef.observe(.value, with: { snapshot in

    let users: [User] = []

    for item in snapshot.children {

        if let foo = item.value as? [String: AnyObject] {
            let user = User()

            user.name = foo["name"] as? String
            user.email = foo["email"] as? String

            users.append(user)
        }

    }

}

答案 1 :(得分:0)

尝试将快照转换为像这样的NSDictionary

snap.value! as! NSDictionary

确保快照不是

答案 2 :(得分:-3)

试试这个:

var ref = new Firebase("https://YOUR-URL.firebaseio.com/");
ref.orderByChild("location").equalTo("United States").on("child_added", function(snapshot) {
  document.write(snapshot.key());
console.log(snapshot.key());
});

location替换为email,将nameUnited Sates替换为您要搜索的参数。

BTW,document.write(snapshot.key())实际上会将snapshot打印到HTML网页上,而不仅仅是在控制台中!