【问题标题】:Having trouble trying to obtain value from Firebase尝试从 Firebase 获取价值时遇到问题
【发布时间】:2018-01-03 13:37:40
【问题描述】:

我正在尝试在我设置的 Firebase 数据库中获取一个值,但我在尝试将其取出时遇到了问题。在我的程序中有一个部分,我在其中遍历Cities 下的每个孩子并获得每个城市的名称。我认为尝试在同一部分中获取每个城市的状态是个好主意,但我无法将其取出。下面是 JSON 对象的示例。我觉得我很接近,但缺少一些东西来把它们放在一起。

"Users" : {
    "NPNBig20BXNpX4Rz0UbMyiKAarY2" : {
      "Cities" : {
        "New York City" : {
          "Status" : "Empty"
        },
        "Atlanta" : {
          "Status" : "Empty"
        },
        "Test City" : {
          "Status" : "Wow",
          "Value" : "Test"
        }
      },
      "Email" : "fakeemail@gmail.com"
    }
  }

代码:

guard let uid = userID else { return }
    let databaseRef = Database.database().reference(fromURL: "https://testApp.firebaseio.com/").child("Users").child(uid).child("Cities")
    var dataTest : [String] = []
    //var cityDictionary: [String:String]()
    databaseRef.observeSingleEvent(of: .value, with: {(snapshot) in
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let key = snap.key
            guard let value = snap.value else { return }
            //let testData = value["Status"] **Type Any has no subscript
            print("Key: ", key, "\nValue: ", value)
            dataTest.append(key)
        }
        completion(dataTest)
    })

这是打印输出

Key:  New York City 
Value:  {
    Status = Empty;
}
Key:  Sintra 
Value:  {
    Status = Empty;
}
Key:  Test City 
Value:  {
    Status = Wow;
    Value = Test;
}

【问题讨论】:

  • print("Key: ", key, "\nValue: ", value) 打印什么?
  • @RichieRich 添加了打印出来的问题

标签: swift firebase firebase-realtime-database


【解决方案1】:

您可以通过以下方式从您的value 获取Status

if let value = snap.value as? [String: AnyObject] {
    let Status = value["Status"] as? String ?? ""
}

您的完整代码将是:

guard let uid = userID else { return }
    let databaseRef = Database.database().reference(fromURL: "https://testApp.firebaseio.com/").child("Users").child(uid).child("Cities")
    var dataTest : [String] = []
    //var cityDictionary: [String:String]()
    databaseRef.observeSingleEvent(of: .value, with: {(snapshot) in
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let key = snap.key
            guard let value = snap.value else { return }
            //let testData = value["Status"] **Type Any has no subscript
            if let value = snap.value as? [String: AnyObject] {
                let Status = value["Status"] as? String ?? ""
            }
            print("Key: ", key, "\nValue: ", value)
            dataTest.append(key)
        }
        completion(dataTest)
    })

【讨论】:

    【解决方案2】:
    func handleGetCities(_ completion: @escaping ([String]) -> ()) {
        guard let uid = Auth.auth().currentUser?.uid else { return }
        // OR
        guard let uid = userID else { return }
        // THEN
        var data: [String] = []
        let reference = Database.database().reference()
        reference.child("Users").child(uid).child("Cities").observe(.childAdded, with: { (snapshot) in
    
            let city_name = snapshot.key
            data.append(city_name)
            completion(data)
    
        }, withCancel: nil)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多