如果用户名已在使用中,请检查Firebase数据库

时间:2016-12-29 22:09:22

标签: ios swift firebase firebase-realtime-database

我正在尝试验证用户输入的用户名是否已被占用。代码当前检查电子邮件是否正在使用,如果用户不存在则创建用户。我怎样才能读取数据库以查看用户名是否已被占用?

FIRAuth.auth()?.createUser(withEmail: email!, password: password!) { (user, error) in
    if error?._code == (FIRAuthErrorCode.errorCodeInvalidEmail.rawValue)
    {
        var ref: FIRDatabaseReference!
        ref = FIRDatabase.database().reference()
        ref.child("Users").observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in

            if snapshot.hasChild(name!){
                ref.child("users").child((user?.uid)!).setValue(["username": name])
                print("true rooms exist")
            } else {
                self.displayMyAlertMessage(userMessage: "Username already in use. Please choose another.")
                print("false room doesn't exist")
            }
        })
    } else {
        self.displayMyAlertMessage(userMessage: "Email already in use. Please see the login page.")
        return
    }
}

1 个答案:

答案 0 :(得分:2)

你可以做的是创建另一个孩子,例如" takenUsernames",将所有用户名存储在那里。就像这样,即使用户未经过身份验证,您也可以检查用户是否被接听。您还必须将规则添加到数据库中。

数据库规则:

"takenUsernames": {
        ".read": true,
        ".write": "auth != null",
        "$username": {
        ".validate": "!root.child('takenUsernames').hasChild($username)"
        }
      }

在Swift中你可以这样做,其中username是textField的值。它基本上只需要用户名并检查在takeUsername子项中是否存在:

let usernamesRef = FIRDatabase.database().reference().child("takenUsernames")
                usernamesRef.child(username).observeSingleEvent(of: .value, with: { (snapshot) in
                    if snapshot.exists() {
                        //Username is already taken
                    } else {
                      //Username doesn't exist, do your stuff
}

现在每次注册用户时,都必须将key value对添加到takenUsernames子项中。就我而言,我这样做:

usernamesRef.updateChildValues([username:uid])

我希望你明白这一点。