2016-06-15 16 views
6

Ich habe eine App, die nach der Verwendung von Firebase Auth Benutzer die Daten in der Firebase-Datenbank speichern. Vor dem Speichern der Daten möchte ich überprüfen, ob der Benutzername, den der Benutzer gibt, bereits in der Datenbank existiert. Also, wenn es nicht existiert, könnte ich dem Benutzer diesen eindeutigen Benutzernamen geben (so wie jeder Benutzer einen eindeutigen Benutzernamen hat). So habe ich eine textField, wo der Benutzer seinen Benutzernamen eingeben, und drücken Sie dann auf Weiter. Dann sollte die App prüfen, ob der Benutzername existiert oder nicht und dem Benutzer mitteilen, ob er ihn ändern muss.Überprüfen Sie, ob Benutzer mit Firebase 3.0 + swift

den Code So habe ich vor, wenn der Benutzername zu überprüfen:

 let databaseRef = FIRDatabase.database().reference() 

     databaseRef.child("Users").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

      if snapshot.hasChild(self.usernameTextField.text!){ 

       print("user exist") 

      }else{ 

       print("user doesn't exist") 
      } 
     }) 

jedes Mal, so dass die nächste Taste gedrückt wird, wird dieser Code genannt. Das Problem dabei ist, dass das Ergebnis immer gleich bleibt wie bei der ersten Suche (auch nach der Änderung des textField Wertes). Zum Beispiel, wenn ich Jose suche, und Jose existieren in meiner Datenbank so wird "Benutzer existiert" drucken. Aber wenn ich den textField zu dem Namen ändere, der nicht existiert, zeigt es noch "Benutzer existiert" an.

+0

Gut zu hören, dass Sie den Fehler gefunden haben. Werfen Sie auch einen Blick auf diese Frage, wenn Sie den Nutzern einen eindeutigen Nutzernamen zuweisen möchten: http://stackoverflow.com/questions/25294478/how-do-you-prevent-duplicate-user-properties-in-firebase –

Antwort

4

habe ich herausgefunden ich die .Value zu FIRDataEventType.Value

if (usernameTextField.text?.isEmpty == false){ 
     let databaseRef = FIRDatabase.database().reference() 

     databaseRef.child("Users").observeSingleEventOfType(FIRDataEventType.Value, withBlock: { (snapshot) in 

      if snapshot.hasChild(self.usernameTextField.text!){ 

       print("true rooms exist") 

      }else{ 

       print("false room doesn't exist") 
      } 


     }) 
+2

Würde das nicht länger dauern, je mehr Benutzer Sie in Ihrer Datenbank haben? – WYS

+0

Ja, Sie haben Recht. Vielleicht ist der schlauere Weg, es zu tun, eine "gleiche" Abfrage auf den Beobachter zu haben. @ WYS –

0
struct ModelUser { 
    var id: String 
    var name: String 

    init(data: DataSnapshot) { 
     // do init stuff 
    } 
} 

func isUserRegistered(with id: String, completion: @escaping (_ exists: Bool, _ user: ModelUser?) ->()) { 
    DatabaseReference.users.child(id).observeSingleEvent(of: .value) { (snapshot) in 
     if snapshot.exists() { 
      // user is already in our database 
      completion(true, ModelUser(data: snapshot)) 
     } else { 
      // not in database 
      completion(false, nil) 
     } 
    } 
} 

Dieser arbeitete für mich in einer ähnlichen Situation wie Sie ändern müssen. Sie können den RX auch so gehen.

Der Schlüssel in beiden Fällen ist die Verwendung der .exists() -Methode des Snapshots.

Verwandte Themen