Firebase查询唯一的用户名swift

时间:2017-05-15 04:56:13

标签: ios firebase swift3 firebase-realtime-database xcode8

我搜索了这个问题,但他们都没有一个对我有用的答案。

我想在用户注册帐户时这样做,它会在创建帐户之前检查他们输入的用户名是否已经存在。我曾尝试在firebase中使用查询,但我似乎无法让它工作。

以下是我的firebase数据的图片:My firebase data tree

如何使用查询来查找密钥“username”的字符串?

3 个答案:

答案 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
  })
}

按照您的方式,您应该将loginusername交换。

希望有所帮助