2016-12-23 4 views
1

Meine Datenbank Werte wie folgt sortiert hat:durch Kinder Suche Werte Firebase/Swift

Users 
    UID 
     Username 
     Email 

Ich wollte ein Freund Hinzufügen System implementieren, in dem Sie einen Benutzernamen oder E-Mail suchen entweder für und es können Sie die hinzufügen Person.

Ich bin in der Lage Benutzer zu lokalisieren, indem

REF_USERS.queryOrdered(byChild: "displayname").queryEqual(toValue: input).observeSingleEvent(of: .value) { (snapshot: FIRDataSnapshot) in { 
print(snapshot.value) 
} 

Damit ich mit dem Benutzer gesamten Wörterbuch bekommen, aber ich bin ein Problem mit der UID greifen.

snapshot.key gibt mir "Benutzer".

Wie kann ich den UID-Wert aus dem Wörterbuch herausholen, nachdem ich das Wörterbuch des Benutzers mit seinem Benutzernamen/E-Mail gefunden habe?

Antwort

1

Wenn Sie eine Abfrage gegen die Firebase-Datenbank ausführen, Es wird möglicherweise mehrere Ergebnisse geben. Der Snapshot enthält also eine Liste dieser Ergebnisse. Selbst wenn nur ein Ergebnis vorhanden ist, enthält der Snapshot eine Liste mit einem Ergebnis.

let query = REF_USERS.queryOrdered(byChild: "displayname").queryEqual(toValue: input) 
query.observeSingleEvent(of: .value) { (snapshot: FIRDataSnapshot) in { 
    for child in snapshot.children { 
     print(child.key) 
    } 
} 

Siehe auch:

1

Try this ...

eine Struktur annehmen (diese Swift 2, Firebase 2)

users 
    uid_0 
    email: "[email protected]" 
    displayName: "some display name" 

und wir wollen uid_0 Infos über

let displayName = "some display name" 

usersRef.queryOrdered(byChild: "displayName").queryEqual(toValue: displayName) 
       .observeSingleEvent(of: .childAdded) { (snapshot: FIRDataSnapshot) in { 

    let dict = snapshot?.value as! [String: AnyObject] 
    let email = dict["email"] 
    let displayName = dict["displayName"] 
    print(email!) 
    print(displayName!) 

    let key = snapshot?.key 
    print(key!) 
} 

ein paar Dinge erhalten, note

Die Variable 'dict' wird angewiesen, ein Wörterbuch vom Typ [Str ing: Anyobject].

Jedes Objekt könnte, sei jedes Objekt. Ein String, ein anderes Wörterbuch, ein int. Sie müssen also sicherstellen, dass der Code mit dem Objekt umgehen kann.

Der Snapshot-Schlüssel ist in diesem Fall der Snapshot dieses Benutzers und der Schlüssel muss der übergeordnete Knoten sein, in diesem Fall uid_0. So ist der Ausgang

[email protected] 
some display name 
uid_0 

EDIT:

4 für Firebase aktualisiert, Swift 4 und den Fall behandeln, in denen mehrere Kinder zurückgegeben werden

let usersRef = self.ref.child("users") 

let input = "some display name" 
let query = usersRef.queryOrdered(byChild: "displayName").queryEqual(toValue: input) 
query.observeSingleEvent(of: .value, with: { snapshot in 
    for child in snapshot.children { 
     let snap = child as! DataSnapshot 
     let dict = snap.value as! [String: Any] 
     let email = dict["email"] as! String 
     let displayName = dict["displayName"] as! String 
     print(email) 
     print(displayName) 

     let key = snapshot.key 
     print(key) 
    } 
}) 
+0

Dies funktioniert nicht. Das ist in Ordnung, wenn Sie einen einzigen Datensatz haben. Wie würdest du es finden, wenn du uid_0 und uid_1 hättest und die gesuchte Email in uid_1 ist?Die UIDs werden automatisch generiert und Sie kennen sie nicht, müssen aber die Kinder suchen, um die E-Mail zu finden und den Datensatz zurückgeben. – justdan0227

+0

@ justdan0227 Es funktioniert! Der Code wurde getestet. Du bist jedoch * Use Case * ist anders als das, was in der Frage war. Das OP fragt, wie man die UID bekommt, sobald der Knoten gefunden wurde, und mein Code adressiert, wie man diese UID erhält (was der Snapshot? .key ist), vorausgesetzt, dass jeder Knoten einen diskreten Benutzernamen und eine E-Mail hat. Mein Code macht das. Wenn jedoch mehrere Ergebnisse möglich sind, gibt die Abfrage einen Snapshot zurück, der alle übereinstimmenden Knoten enthält. Sie würden dann über den Schnappschuss iterieren, um die UIDs in Frage zu bekommen - siehe Franks Antwort für dieses Beispiel. – Jay

+0

Sorry @Jay, ich dachte, die ursprüngliche Frage lautete: "Wie kann ich den UID-Wert aus dem Wörterbuch herausholen, nachdem ich das Wörterbuch des Benutzers mit seinem Benutzernamen/E-Mail gefunden habe?" Das bedeutet, dass Sie zuerst den "Datensatz" basierend auf Benutzername/E-Mail finden und dann die UID zurückgeben müssen. – justdan0227