2016-04-27 16 views
1

Ich habe VC, wo ich einen neuen Benutzer erstellen und Firebase hinzufügen. Der Benutzer fügt kein Problem in die Datenbank ein, aber ich habe Probleme zu überprüfen, ob bereits ein Benutzer mit demselben Namen existiert. Ich habe versucht, verschiedene Abfrageanweisungen innerhalb Firebase zu verwenden, aber keine Freude zu bekommen. Weiß jemand, wie ich meinen Code ändern kann, um dies zu erreichen? hier ist es: -Firebase-Prüfung für vorhandenen Benutzer in swift

@IBAction func submitUsername(sender: AnyObject) { 

    if let user = usernameTxtField.text where user != "" { 

     let username = DataService.ds.REF_USERS.childByAppendingPath("username") 

     username.observeSingleEventOfType(.Value, withBlock: { snap in 

      if let usernameDoesNotExist = snap.value as? NSNull { 
       let currentUser = DataService.ds.REF_USER_CURRENT.childByAppendingPath("username") 
       self.usernameTxtField.text = user 
       currentUser.setValue(user) 
      } 
     }) 

     dismissViewControllerAnimated(true, completion: nil) 

    } else { 
     showAlert("Username Needed", msg: "please choose a username") 
    } 
} 

und die Feuerbasis Datenstruktur

"users" : { 
    "000591b6-ba88-4670-9cb7-edd79c273eab" : { 
     "newuser" : "added to FB", 
     "provider" : "password" 
    }, 
    "05551c90-27fe-4969-b45d-279a72583857" : { 
     "newuser" : "added to FB", 
     "provider" : "password" 
    }, 
    "0bbff1b0-681a-4fef-adc0-c4779a4b2100" : { 
     "provider" : "password", 
     "testing" : "emailtest", 
     "username" : "richy446" 
    }, 
    "12f35e7a-2430-49b3-a287-f7b1daf6a121" : { 
     "newuser" : "added to FB", 
     "provider" : "password", 
     "username" : "richy445" 
    }, 
    "15a45560-cc81-4c2d-bb59-b8ce6b125d68" : { 
     "provider" : "password", 
     "testing" : "emailtest", 
     "username" : "richy445" 
    }, 
    "1c135936-6dd0-4189-bcd7-e8036e9736f9" : { 
     "newuser" : "added to FB", 
     "provider" : "password" 
    }, 
    "21591e29-f083-452c-b74f-cc567cecb183" : { 
     "newuser" : "added to FB", 
     "provider" : "password" 
    }, 
    "8b385aa7-0e80-426b-a385-5b3317c894d0" : { 
     "newuser" : "added to FB", 
     "provider" : "password", 
     "username" : "richy445" 
    } 
} 
+0

Sind Sie fragen, wie zu sehen, zu überprüfen, ob der Benutzername in Firebase (das heißt Anmeldedaten) vorhanden ist oder fragen Sie, wie zu sehen, ob der Benutzername in Ihrem/Benutzer Knoten vorhanden ist? Wenn Sie Ihre Firebase-Struktur veröffentlichen (als Text, keine Bilder, bitte), hilft uns das, Ihre Struktur zu verstehen und Ihre Frage zu klären. – Jay

+0

mainDict -> Beiträge -> Benutzer -> Benutzername, das ist die Struktur von Firebase, innerhalb des Benutzernamens, ich möchte einen Benutzer zu der Datenbank hinzufügen, die ich mache, aber aber wenn ein Benutzername bereits vergeben ist, möchte ich nicht hinzufügen ein Benutzer (wird wahrscheinlich eine Nachrichtenbenachrichtigung irgendeiner Art anzeigen) –

+0

Das ist nicht wirklich eine gute Struktur, um Benutzernamen zu speichern. Die Kindknoten von/users sollten die UID sein, und ein untergeordnetes Kind sollte ein Benutzername sein: "der Benutzername" als ein Schlüssel: Wert-Paar. Es wird wahrscheinlich andere Probleme verursachen, da der Benutzerknoten ein Kind des posts-Knotens ist. Können Sie Ihre Frage bitte mit Ihrer Firebase-Struktur aktualisieren? Das wird uns davon abhalten, neu zu tippen und wird auch die Frage und das Problem klären. – Jay

Antwort

4

Es gibt eine Reihe von Ansätzen für doppelte Daten zu überprüfen. Die Struktur Firebase Sie scheint ein wenig widersprüchlich, so dass es wie diese Strukturierung

einfacher sein kann
"000591b6-ba88-4670-9cb7-edd79c273eab" : { 
     "email" : "[email protected]", 
     "password" : "password" 
    }, 
"05551c90-27fe-4969-b45d-279a72583857" : { 
     "email" : "[email protected]", 
     "password" : "password" 
    }, 

1) Lassen Sie für Firebase die Arbeit machen.

Beim Erstellen eines Benutzers gibt Firebase einen Fehler zurück, wenn der Benutzername (E-Mail) bereits vorhanden ist. Mit dieser Methode wird verhindert, dass zufällige Daten in Ihren Firebase geschrieben werden, bis das Konto in Firebase erstellt wurde.

myRootRef.createUser(email, password: pw, withValueCompletionBlock: { error, result in 

    if error != nil { 
     self.errMsgField.stringValue = "email/username in use, try again" 

    } else { 
     let uid = result["uid"] as! String //the uid of the new user 
     print("user created as \(uid)") 
     self.storedDataInUserNode(email, password:pw) 
     self.authUserWithAuthData(email, password: pw) //auth the user 
     // and proceed in starting up the app 
    } 
}) 

2) Überprüfen auf vorhandene Daten in Firebase.

Während die erste Methode stoppt Daten von an erster Stelle geschrieben werden, wenn Sie für doppelte Daten im Allgemeinen überprüfen möchten, hier ist ein Muster:

let userName = the userName or email the user entered 
let usersRef = Firebase(url:"https://test.firebaseio.com/users") 
usersRef.queryOrderedByChild("email").queryEqualToValue("\(userName!)") 
      .observeSingleEventOfType(.Value, withBlock: { snapshot in 

     if (snapshot.value is NSNull) { 
      print("not found)") //didnt find it, ok to proceed 

     } else { 
      print(snapshot.value) //found it, stop! 
     } 
} 
0

Es gibt eine Methode auf DataSnapshot namens .exists() das kannst du so nennen. Aktualisiert für Swift 4.

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) 
     } 
    } 
} 
Verwandte Themen