我搜索了这个问题,但他们都没有一个对我有用的答案。
我想在用户注册帐户时这样做,它会在创建帐户之前检查他们输入的用户名是否已经存在。我曾尝试在firebase中使用查询,但我似乎无法让它工作。
以下是我的firebase数据的图片:My firebase data tree
如何使用查询来查找密钥“username”的字符串?
答案 0 :(得分:6)
您可以这样做,使用完成块创建一个功能以检查您的Firebase数据库中是否已存在用户名并在此基础上创建新用户
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)
}
})
}
现在只需在创建新用户时调用此函数:
self.checkUserNameAlreadyExist(newUserName: "Johnson") { isExist in
if isExist {
print("Username exist")
}
else {
print("create new user")
}
}
答案 1 :(得分:3)
我就是这样做的:
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
}
})
确保在数据库规则中索引“name”上的“users”节点以进行性能优化。
答案 2 :(得分:0)
我接下来这样做:
注册功能:
@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)
}
我的用户类功能。它的API类似于:
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
})
}
按照您的方式,您应该将login
与username
交换。
希望有所帮助