2017-02-07 3 views
0

Ich habe sehr wenig Erfahrung mit Firebase und iOS und habe mich gefragt, ob es möglich ist, eine Abfrage in Swift zu erstellen, um bestimmte Daten in der JSON-Struktur des Firebase zu finden.Firebase-Abfrage (in swift) um festzustellen, ob der Benutzername bereits in der Datenbank existiert

Wenn ein Benutzer ein Konto in der App erstellt, wird er aufgefordert, einen Benutzernamen auszuwählen. Wenn der Benutzer auf dem gleichen Bildschirm auf die Schaltfläche "Weiter" klickt, möchte ich die Datenbank in Echtzeit abfragen, um festzustellen, ob der vom Benutzer gewählte Benutzername bereits existiert oder nicht.

Ich las eine Reihe von Artikeln im Internet, konnte aber nichts finden, was mich mein Ziel erreichen lassen würde. Bisher habe ich den folgenden Code geschrieben, der nicht funktioniert, aber ich kann die Ursache des Problems nicht genau bestimmen (beachte, dass benutzername.text das Textfeld ist, in dem der Benutzer seinen gewünschten Benutzernamen eingibt und mit dem die Überprüfung durchgeführt wird):

FIRDatabase 
    .database() 
    .reference() 
    .child("username") 
    .queryOrderedByValue() 
    .queryEqual(toValue: self.username.text!) 
    .observeSingleEvent(of: .value, with: {(snap) in 

      if snap.exists(){ 
       // Username unavailable, choose another one 
      } else { 
       // Username available, OK to keep this username 
      } 
}) 

Die DB-Struktur ist wie folgt:

{ 
    "users" : { 

     USER_1_UID : { 
      "account" : { 
       "email" : "[email protected]", 
       "first name" : "myFirstName", 
       "last name" : "myLastName", 
       "username" : "my.username" 
      } 
     } 

     USER_2_UID : { 
      "account" : { 
       "email" : "[email protected]", 
       "first name" : "myFirstName2", 
       "last name" : "myLastName2", 
       "username" : "my.username2" 
      } 
     } 
    } 
} 

ich bin offen meine DB-Struktur zu ändern, um die „Benutzernamen“ Notiz hinzufügen, wie unten gezeigt, kann es alle registrierten Benutzernamen enthalten, wenn die Abfrage einfacher machen:

{ 
    "users" : { 

     USER_1_UID : { 
      "account" : { 
       "email" : "[email protected]", 
       "first name" : "myFirstName", 
       "last name" : "myLastName", 
       "username" : "my.username" 
      } 
     } 

     USER_2_UID : { 
      "account" : { 
       "email" : "[email protected]", 
       "first name" : "myFirstName2", 
       "last name" : "myLastName2", 
       "username" : "my.username2" 
      } 
     } 
    } 

    "listOfUsernames" : { 
     USER_1_UID : "my.username" 
     USER_2_UID : "my.username2" 
    } 
} 

Jede Hilfe an dieser Stelle ist willkommen. Vielen Dank!

Antwort

0

Ihr Code ist ziemlich nah. Drei Änderungen:

Remove queryOrderedByValue 

dann haben Sie Ihre Benutzerinformationen zu tief begraben

USER_1_UID : { 
     "account" : { 
      "email" : "[email protected]", 
      "first name" : "myFirstName", 
      "last name" : "myLastName", 
      "username" : "my.username" 
     } 
    } 

Wechsel zu (entfernen Sie das Konto Knotennamen, da es nicht nötig ist)

USER_1_UID : { 
    "email" : "[email protected]", 
    "first name" : "myFirstName", 
    "last name" : "myLastName", 
    "username" : "my.username" 
    } 

und dann Sie müssen Firebase mitteilen, welchen Knoten Sie abfragen möchten

, also ändern Sie zu

let usersRef = rootRef.child("users") 
let queryRef = usersRef.queryOrdered(byChild: "username") 
          .queryEqual(toValue: "some user name") 
queryRef.observeSingleEvent(of: .value, with: { snapshot in 
    print(snapshot) //you need snapshot, or snap or some other var name 
}) 

Schließlich brauchen Sie keinen listOfUsernames-Knoten, Ihr Benutzerknoten funktioniert einwandfrei.

+0

Vielen Dank für Ihre Antwort Jay. Aber es funktioniert nicht an meinem Ende. Der Code in der Closure wird nicht ausgeführt (ich habe das getestet, indem ich einen einfachen ** print ("Das Programm hat so weit gemacht") ** nach dem ** {snapshot in ** gemacht hat, aber nichts wurde jemals in der Konsole gedruckt) . Ist diese Firebase-Abfrage in Ordnung, obwohl der Schlüssel, auf den ich zugreifen möchte, unter _users/** someUniqueUID **/account/username_ verschachtelt ist? Danke – ayarem502

+0

@ ayarem502 lol. Du hast Recht! Sehen Sie meine leicht aktualisierte Antwort, da sie sich um das Problem kümmern wird. Ich habe den zusätzlichen Knotennamen in jedem Benutzerknoten übersehen, der nicht benötigt wird. – Jay

+0

Ich hatte den "account" -Knoten, da ich auch einen "profile" -Knoten mit verschiedenen Arten von Informationen darin habe, die ich nicht in meinem aktuellen Beitrag eingeschlossen habe, um Verwirrung zu vermeiden. Ich habe jedoch versucht, den Knoten "account" zu entfernen und den Code auszuführen, und es tritt immer noch nicht in den Abschluss ein. Ich habe dann versucht, die Abfrage zu drucken, um zu sehen, was es den Benutzernamen vergleicht: ** print (FIRDatabase.database(). Reference(). Child ("Benutzer"). QueryOrdered (byChild: "Benutzername")) ** Dies gibt zurück etwas, was ich ehrlich gesagt nicht wirklich verstehe: ** (/ users { i = username; }) **. Aber sollte ich nicht eine Liste von Benutzernamen erwarten?Nochmals vielen Dank – ayarem502

Verwandte Themen