2016-04-03 19 views
0

Ich habe eine Abfrage, die nach einer bestimmten UUID sucht und das Objekt zurückgibt.Abrufen untergeordneter Werte von Firebase

print(snapshot) 
Snap (users) { 
"-KENROf9kGUPw1j6ghFo" =  { 
    UUID = "A1166D66-31B4-4B1C-B28C-58E9E5615D16"; 
    nickname = Craig; 
}; 
} 

Ich versuche, die nickname extrahieren, aber Probleme haben.

Hier ist meine Abfrage let queryRef = Firebase(url:"https://<url>.firebaseio.com/users")

Und hier ist die Abfrage Referenz.

var handle = queryRef.queryOrderedByChild("UUID").queryEqualToValue("A1166D66-31B4-4B1C-B28C-58E9E5615D16").observeSingleEventOfType(.Value, withBlock: { snapshot in 
     if snapshot.value is NSNull { 
      print("snapshot empty") 
     } else { 
      print(snapshot) //this prints the snapshot above 
      self.nickname = snapshot.value.objectForKey("nickname") as! String //this returns an error 
      print(self.nickname) 
     } 
    }) 
} 

Die self.nickname.... Linie gibt den folgenden Fehler.

fatal error: unexpectedly found nil while unwrapping an Optional value Ich habe ein paar verschiedene Möglichkeiten versucht, dies zu strukturieren, habe aber noch keinen Weg gefunden, der nicht scheitert.

Antwort

1

Sie speichern die Benutzer unter einer Push-ID und dann abfragen sie von ihrer UID. Das ist eine schlechte Idee. Stattdessen speichern die Benutzer unter ihrer uid (oder in Ihrem Fall UUID), da diese Probe aus dem Firebase documentation on storing user data zeigt:

ref.authUser("[email protected]", password:"correcthorsebatterystaple") { 
    error, authData in 
    if error != nil { 
     // Something went wrong. :(
    } else { 
     // Authentication just completed successfully :) 
     // The logged in user's unique identifier 
     println(authData.uid) 
     // Create a new user dictionary accessing the user's info 
     // provided by the authData parameter 
     let newUser = [ 
      "provider": authData.provider, 
      "displayName": authData.providerData["displayName"] as? NSString as? String 
     ] 
     // Create a child path with a key set to the uid underneath the "users" node 
     // This creates a URL path like the following: 
     // - https://<YOUR-FIREBASE-APP>.firebaseio.com/users/<uid> 
     ref.childByAppendingPath("users") 
      .childByAppendingPath(authData.uid).setValue(newUser) 
    } 
} 

Wenn Sie Ihre aktuelle Datenstruktur bestehen kleben, müssen Sie die Tatsache umgehen, dass ein .Value Abfrage gibt eine Liste von Kindern zurück. Selbst wenn nur ein Element mit der Abfragebedingung übereinstimmt, ist es immer noch eine Liste mit einem Element.

var query = queryRef.queryOrderedByChild("UUID").queryEqualToValue("A1166D66-31B4-4B1C-B28C-58E9E5615D16") 
query.observeSingleEventOfType(.Value, withBlock: { snapshot in 
    if snapshot.value is NSNull { 
     print("snapshot empty") 
    } else { 
     for child in snapshot.children { 
      self.nickname = child.value.objectForKey("nickname") as! String 
      print(self.nickname) 
     } 
    } 
}) 
+0

ist also folgte ich Ihr Rat und wechselte zum Speichern des Benutzers durch die iPhone UUID. Die App erfordert keine Passwörter oder Authentifizierung. Wenn sich der Benutzer anmeldet, wird nur überprüft, ob seine UUID zuvor protokolliert wurde. Wie auch immer, ich kann die Abfrage nicht mehr zum Laufen bringen, lasst query = Firebase (url: "firebaseurl.com/users/") 'und die Abfrage lautet' var handle = query.queryOrderedByChild ("users"). QueryEqualToValue (UUID) .observeEventType (.Value, withBlock ...... 'Auch wenn ich eine bekannte UUID füttere, druckt es immer noch' snapshot empty'. –

0

Ersetzen Sie diese Zeile:

self.nickname = snapshot.value.objectForKey("nickname") as! String 

mit den folgenden:

self.nickname = snapshot.value["nickname"] as! String 

Und stellen Sie sicher, dass Ihr Schnappschuss ein Objekt mit einer Eigenschaft "Spitznamen"