2017-05-15 2 views
3

Ich suchte nach dieser Frage, aber keiner von ihnen hatte eine Antwort, die für mich funktionierte.Firebase Abfrage für eindeutige Benutzername swift

Ich möchte es so machen, wenn ein Benutzer ein Konto registriert, überprüft es, ob der Benutzername, den sie eingegeben haben, bereits existiert, bevor das Konto erstellt wird. Ich habe versucht, Abfragen in Firebase, aber ich kann es einfach nicht funktionieren. Hier

ist ein Bild von dem, was meine Feuerbasis Daten wie folgt aussehen: My firebase data tree

Wie würde ich Abfrage verwenden, um die Zeichenfolge für den Schlüssel „username“ zu finden?

+1

Sie können die richtige Antwort akzeptieren. Tippen Sie auf Dohle :) –

Antwort

4

Sie können weitergehen, eine Funktion mit Abschluss Block machen Benutzernamen zu überprüfen, ist es bereits in Ihrem Firebase DB und neuen Benutzer auf der Grundlage es

func checkUserNameAlreadyExist(newUserName: String, completion: @escaping(Bool) -> Void) { 

    let ref = FIRDatabase.database().reference() 
    ref.child("users").queryOrdered(byChild: "username").queryEqual(toValue: newUserName) 
       .observeSingleEvent(of: .value, with: {(snapshot: FIRDataSnapshot) in 

     if snapshot.exists() { 
      completion(true) 
     } 
     else { 
      completion(false) 
     } 
    }) 
} 

nun einfach diese Funktion aufrufen, wenn Sie erstellen neue Benutzer:

self.checkUserNameAlreadyExist(newUserName: "Johnson") { isExist in 
    if isExist { 
     print("Username exist") 
    } 
    else { 
     print("create new user") 
    } 
} 
+0

nur wundernd mussten Sie Ihre Durchlässigkeiten ändern, um diese Arbeit zu machen, weil, wenn ein Benutzer in den meisten Situationen nicht authentifiziert ist, Sie überhaupt nicht aus der Datenbank lesen könnten –

2

Dies ist, wie ich es tun:

var text = "Your username" 

let dbRef = FIRDatabase.database().reference().child("users") 
dbRef.queryOrdered(byChild: "name").queryEqual(toValue: text).observeSingleEvent(of: .value, with: { snapshot in 
    if !snapshot.exists() { 
     // Name doesn't exist 
    } 

    if let data = snapshot.value as? [String: [String: String]] { 
     // it should exist if it reaches here 
    } 
}) 

Achten Sie darauf, die „Benutzer“ Knoten „name“ zur Performance-Optimierung in Ihrer Datenbank Regeln zu indizieren.

0

ich diese nächste Art und Weise tun:

Die Funktion des Registers:

@IBAction func signUpButtonTapped(_ sender: Any) { 
    User.getItemByLogin(for: userLogin.text!, 
         completion: { userItem in 
         if userItem == nil { 
          self.createAndLogin() 
         } else { 
          self.showAlertThatLoginAlreadyExists() 
         } 
    }) 
} 


private func createAndLogin() { 
    FIRAuth.auth()!.createUser(withEmail: userEmail.text!, 
          password: userPassword.text!) { user, error in 
           if error == nil { 
            // log in 
            FIRAuth.auth()!.signIn(withEmail: self.userEmail.text!, 
                  password: self.userPassword.text!, 
                  completion: { result in 
                  // create new user in database, not in FIRAuth 
                  User.create(with: self.userLogin.text!) 

                  self.performSegue(withIdentifier: "fromRegistrationToTabBar", sender: self) 
            }) 
           } else { 
            print("\(String(describing: error?.localizedDescription))") 
           } 
} 

private func showAlertThatLoginAlreadyExists() { 
    let alert = UIAlertController(title: "Registration failed!", 
           message: "Login already exists.", 
           preferredStyle: .alert) 

    alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil)) 

    present(alert, animated: true, completion: nil) 
} 

Meine Benutzerklassenfunktion. Es ist API wie Klasse:

static func getItemByLogin(for userLogin: String, 
          completion: @escaping (_ userItem: UserItem?) -> Void) { 
    refToUsersNode.observeSingleEvent(of: .value, with: { snapshot in 

    for user in snapshot.children { 
     let snapshotValue = (user as! FIRDataSnapshot).value as! [String: AnyObject] 
     let login = snapshotValue["login"] as! String // getting login of user 

     if login == userLogin { 
      let userItem = UserItem(snapshot: user as! FIRDataSnapshot) 
      completion(userItem) 
      return 
     } 
    } 

    completion(nil) // haven't founded user 
    }) 
} 

in Ihrer Art und Weise Sie login mit username tauschen sollte.

Hoffe es hilft

Verwandte Themen