2016-11-25 2 views
0

Fehler beim Abrufen von Daten aus Firebase.Firebase Swift 3-Fehler beim Typcasting

Hier ist mein Code:

// MARK:- Pull in data from Firebase on the main thread. READ ONLY ONCE. 
self.ref.child("Power_Stations").child("Stations").observeSingleEvent(of: .value, with: {  snapshot in 
if snapshot.exists() { 
    for item in snapshot.children { 
     let x = item as! FIRDataSnapshot 
     let name = x.value(forKey: "Power_Station_Name") as Any 
     print(name) 
    } 
} 

})

Problem: Beenden app aufgrund nicht abgefangene Ausnahme 'NSUnknownKeyException' Grund: ‚[valueForUndefinedKey:]: Diese Klasse ist nicht Schlüsselwert Kodierungskonform für den Schlüssel Power_Station_Name. ' < - Dies geschieht bei

let name = x.value(forKey:"Power_Station_name") as Any 

Der obige Fehler wird mir zu sagen, dass ich einen Crash bin immer, wenn es eine Variable mit einem bestimmten Wert zu füllen versucht?

Allerdings, wenn ich die Daten drucken das ist, was ich in den Protokollen bin Empfang:

Snap (-KXRfS0afUet-U8r996p) { 
"Power_Station_Address" = nil; 
"Power_Station_City" = nil; 
"Power_Station_ID" = VsNggVo; 
"Power_Station_Inventory" =  { 
    android = 12; 
    "android_description" = "Fully Stocked"; 
    ios = 6; 
    "ios_description" = "Fully Stocked"; 
}; 
"Power_Station_Lat" = "33.6000422"; 
"Power_Station_Long" = "23.228643"; 
"Power_Station_Name" = "Power Pods Station"; 
"Power_Station_Owner" = "Power Pods Inc."; 
"Power_Station_Rating" =  { 
    "Average_Ranking" = "4.5"; 
    "Number_Of_Ratings" = 105; 
}; 
"Power_Station_State" = nil; 
"Power_Station_Update_Date" = "2016-11-25 18:09:46 +0000"; 
"Power_Station_Upload_Date" = "2016-11-25 18:09:46 +0000"; 

}

Unten ist, wie ich Daten in die Datenbank speichere.

let newObject = [ 
         "Power_Station_ID" : id, 
         "Power_Station_Name" : "Power Pods Station" as String, 
         "Power_Station_Address" : "\(placeMark.thoroughfare)" as String, 
         "Power_Station_City" : "\(placeMark.locality)" as String, 
         "Power_Station_State" : "\(placeMark.administrativeArea)" as String, 
         "Power_Station_Long" : (placeMark.location?.coordinate.longitude)! as Double, 
         "Power_Station_Lat" : (placeMark.location?.coordinate.latitude)! as Double, 
         "Power_Station_Owner" : "Power Pods Inc." as String, 
         "Power_Station_Inventory" : [ 
          "ios" : 6, 
          "ios_description" : "Fully Stocked" as String, 
          "android" : 12, 
          "android_description" : "Fully Stocked" as String 
          ] as [String : Any], 
         "Power_Station_Rating" : [ 
          "Number_Of_Ratings" : 105, 
          "Average_Ranking" : 4.5, 
          ] as [String : Any], 
         "Power_Station_Upload_Date" : String(describing: NSDate()), 
         "Power_Station_Update_Date" : String(describing: NSDate()) 
        ] as [String : Any] 

        self.ref.child("Power_Stations").child("Stations").childByAutoId().setValue(newObject) 

Kann mir jemand helfen herauszufinden, was ich falsch mache?

Antwort

2

Fügen Sie einfach ein wenig mehr Code hinzu, der snapshot.value als Dictionary für [String: String] (oder String: Any) definiert. Der Wert muss diese Definition haben, da es ein String oder eine NSNummer usw. sein könnte.

+0

Interessant interessant .... das funktioniert. –

+0

danke @Jay ... Ich habe auch den folgenden Code verwendet. x.childSnapshot (fürPfad: "Power_Station_Address"). Wert und es hat auch funktioniert. Wissen Sie warum oder ob dies die offizielle Änderung für das Abrufen der Daten aus Firebase ist? Ich habe Firebase vorher benutzt, aber nie Daten davon wie oben gezogen. –

+0

Denken Sie daran, dass beim Lesen von Firebase .values ​​Strings, Zahlen, ein anderes Wörterbuch oder das gefürchtete Array sein können (bitte verwenden Sie keine Arrays), damit nur Sie wissen, was Sie erwarten, also müssen Sie definieren, was es im Code sein soll. Wenn die Antwort funktioniert, vergiss nicht, sie zu akzeptieren! – Jay