2017-01-14 3 views
1

habe ich die Struktur unten auf Feuerbasis und ich brauche die Auto-ID unterstrichen in rot zu bekommen:Swift 3 und Firebase: Auto-ID-Wert von Snapshot abrufen

enter image description here

Der Code, den ich die Werte abfragen, erstellt :

let query = reference.queryOrdered(byChild: "receiverId").queryEqual(toValue: "LKupL7KYiedpr6uEizdCapezJ6i2") 
     //Start process 
     query.observe(.value, with: { (snapshot) in 
      guard snapshot.exists() else{ 
       print("Data doesn't exists") 
       return 
      } 
      print(snapshot.key) 
} 

Mein "snapshot.value" Ergebnisse in:

Optional({ 
    "-KaRVjQgfFD00GXurK9m" =  { 
     receiverId = LKupL7KYiedpr6uEizdCapezJ6i2; 
     senderId = bS6JPkEDXIVrlYtSeQQgOjCNTii1; 
     timestamp = 1484389589738; 
    }; 
}) 

Wie bekomme ich nur die Zeichenfolge -KaRVjQgfFD00GXurK9m vom Knoten oben?

hatte ich versucht, "print (snapshot.key)" verwenden, aber es ergibt sich auf der Benutzer-ID: bS6JPkEDXIVrlYtSeQQgOjCNTii1

Einige Ideen? Vielen Dank.

+0

Wenn Sie Fragen stellen, verwenden Sie bitte keine Bilder. Verwenden Sie den Text so, dass er durchsucht werden kann, und wir können ihn kopieren und einfügen, anstatt ihn erneut eingeben zu müssen. Außerdem ist der untergeordnete senderId-Knoten ein Duplikat des Eltern-Eltern-Knotens (siehe meine Antwort), und obwohl es nichts Falsches daran gibt, können dieselben Daten aus dem Eltern-Snapshot abgerufen werden (im Wesentlichen nicht erforderlich, da Sie diese Daten bereits haben) der Schnappschuss) – Jay

Antwort

7

.value gibt den übergeordneten Knoten und alle untergeordneten Knoten zurück, die die Ergebnisse der Abfrage erfüllen. In diesem Fall müssten die untergeordneten Elemente wiederholt werden (es könnte mehr als ein untergeordnetes Element geben, das der Abfrage entspricht).

Der Schlüssel snapshot.key ist der Schlüssel des übergeordneten Knotens (bS6JPkEDXIVrlYtSeQQgOjCNTii1) und der Wert ist ein Snapshot (Wörterbuch) aller untergeordneten Elemente. Jeder dieser Kinder ist ein Schlüssel: Wert Paar von UID: Wert und Wert ein Wörterbuch der Kindknoten, ReceiverId, SenderId usw.

Dieser Code wird die UID jedes untergeordneten Knotens und einen der Werte, Zeitstempel, für jeder Benutzerknoten, der der Abfrage entspricht.

let usersRef = ref.child("users") 
    let queryRef = usersRef.queryOrdered(byChild: "receiverId") 
          .queryEqual(toValue: "LKupL7KYiedpr6uEizdCapezJ6i2") 

    queryRef.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] 
      let timestamp = userDict["timestamp"] as! String 
      print("key = \(uid) and timestamp = \(timestamp)") 
     } 
    }) 
+0

Jay, es hat funktioniert! Vielen Dank und Entschuldigung das Bild, ich werde es beim nächsten Mal vermeiden! Um die Antwort zu vervollständigen, habe ich nur die Zeile "** let timestamp = userDict [" timestamp "] geändert als! String **" to "** let timestamp = (userDict [" timestamp "]?. StringValue)! Als String * * "um den Fehler zu vermeiden:" Es konnte kein Wert des Typs 'NSDecimalNumber' in 'NSString' umgewandelt werden. " – Enzo