【问题标题】:How to retrieve data from all the Users using Firebase and Swift如何使用 Firebase 和 Swift 从所有用户那里检索数据
【发布时间】:2018-08-13 10:24:10
【问题描述】:

我有一个看起来像这样的 Firebase 数据库(Json):

       {
  "user" : {
    "UVHpZfD60EWcYDbeV60ENqXaioA3" : {
      "email" : "thisisanothertest@gg.gg",
      "location" : {
        "latitude" : 37.785834,
        "longitude" : -122.406417
      },
      "profile" : {
        "alter" : "23",
        "geschlecht" : "männlich",
        "name" : "Mario1"
      }
    },
    "nEsKd9uIOnSmVuMbAK0K2X1Dz6A3" : {
      "email" : "thisisatest@gg.gg",
      "location" : {
        "latitude" : 37.785834,
        "longitude" : -122.406417
      },
      "profile" : {
        "alter" : "23",
        "geschlecht" : "männlich ",
        "name" : "Mario"
      }
    }
  }

问题: 现在我想从所有用户(纬度和经度)那里获取位置,以便稍后将它们放在地图上。 通过执行以下代码,我可以很容易地获得单个用户的位置。但是我怎样才能一次从所有用户那里获取数据呢?

 var ref: DatabaseReference!
        ref = Database.database().reference()
        let userID = Auth.auth().currentUser?.uid
        ref.child("user").child(userID!).child("location").observeSingleEvent(of: .value, with: { (snapshot) in
            // Get user value
            let value = snapshot.value as? NSDictionary
            let lat = value?["latitude"] as? Double ?? 0.0
            let long = value?["longitude"] as? Double ?? 0.0

我已经发现了一个类似的问题here

所以我尝试了上面链接中的代码:

let usersRef = ref.child("users")
usersRef.observeSingleEvent(of: .value, with: { (snapshot) in

    for snap in snapshot.children {
        let userSnap = snap as! FIRDataSnapshot
        let uid = userSnap.key //the uid of each user
        let userDict = userSnap.value as! [String:AnyObject] //child data
        let location = userDict["Location"] as! String
        print("key = \(uid) is at location = \(location)")
    } 
})

但是用那段代码我只能得到所有的电子邮件地址。通过将“位置”更改为“电子邮件”。如何再下一个节点访问“位置”节点并获取所有用户的纬度和经度?

谢谢你:)

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    您的字典中的 location 键似乎拼错了:

    let location = userDict["Location"] as! [String: AnyObject]
    

    替换为:

    let location = userDict["location"] as! [String: AnyObject]
    

    您始终可以在打印行设置断点,然后在控制台中使用po location 查看您的位置字典。

    【讨论】:

    • 我希望这只是一个错字:/
    • 在上面的示例中,在每一行之后添加一个打印语句并粘贴你得到的内容,例如print("\(uid)"), print("\(userDict)")
    • 这真的只是一个错字:天哪,我现在感觉很愚蠢。谢谢你!
    【解决方案2】:

    正如您在数据中看到的,location 存储为另一个对象,因此您必须将其转换为 Dictionary => [String:AnyObject]

    for snap in snapshot.children {
        let userSnap = snap as! FIRDataSnapshot
        let uid = userSnap.key //the uid of each user
        let userDict = userSnap.value as! [String:AnyObject] //child data
        let location = userDict["location"] as! [String:AnyObject]
        print("key = \(uid) is at location = \(location)")
    } 
    

    【讨论】:

    • @Mario 如果您看一下我的回答,因为我从您的数据中复制并粘贴了密钥的名称,没有什么错,您基本上再次尝试了我的回答,但打错了。
    猜你喜欢
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2017-10-15
    相关资源
    最近更新 更多