【问题标题】:Firebase query in SwiftSwift 中的 Firebase 查询
【发布时间】:2016-01-19 23:06:07
【问题描述】:

我在“/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"))

但我两者都为零。

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

提前致谢!!

【问题讨论】:

  • 您是否尝试过而不是查询("aaa@aaa-com") 而不是("aaa@aaa.com")?我认为这就是为什么找不到它

标签: swift firebase


【解决方案1】:

这个问题很老了,还有很多其他资源。如果您还没有到达那里,希望这会有所帮助。

最简单的方法是将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
    }

} 

斯威夫特 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)
        }

    }

}

【讨论】:

    【解决方案2】:

    尝试将快照转换成这样的 NSDictionary

    snap.value! as! NSDictionary
    

    确保快照不为零

    【讨论】:

      【解决方案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,或name,并将United Sates 替换为您要搜索的参数。

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

      【讨论】:

        猜你喜欢
        • 2018-03-05
        • 2016-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 2016-10-14
        • 2018-04-01
        相关资源
        最近更新 更多