Firestore / Swift 4:检查用户名是否存在?

时间:2018-07-13 23:32:41

标签: ios swift firebase google-cloud-firestore

我正在尝试了解以下代码在哪里出了问题。我试图寻找一种方法来检查users集合是否在username字段的其中一个文档中包含字符串。

结构看起来像这样

#users(collection)
    #userID(document)
        #name:String
        #email:String
        #username:String
    #userID(document)
        #name:String
        #email:String
        #username:String

我要检查的是是否在users内,并且在任何document,内是否在username字段中存在该字符串。通过调用查询用户名的函数,找到了here这个问题的解决方案。

我在扩展程序中创建了该函数:

extension UITextField {

    func checkUsername(username: String, completion: @escaping(Bool) -> Void) {
        let usernameRef = Database.database().reference()
        usernameRef.child("users").queryOrdered(byChild: "username").queryEqual(toValue: username).observeSingleEvent(of: DataEventType.value, with: { (snapshot: DataSnapshot) in
            if snapshot.exists() {
                completion(true)
            }
            else {
                completion(false)
            }
        })
    }

}

,并在textFieldDidEndEditing内的文本字段上调用它,以便它可以在用户尝试声明用户名时执行检查。

func textFieldDidEndEditing(_ textField: UITextField) {

    if activeField == usernameField {
        textField.checkUsername(username: usernameField.text!) { isExist in
            if isExist {
                print("Username exists")
            } else {
                print("Username does not exist")
            }
        }
    }

}

但是,即使用户名确实存在,它也会始终将'Username does not exist'返回到控制台。

数据库中当前有1个名为test的用户名,因此尝试输入测试应返回'Username exists',输入testtwo应返回'Username does not exist'

我在这里想念什么?我假设它没有正确查询数据库?

1 个答案:

答案 0 :(得分:0)

感谢Frank指出我正在调用实时数据库而不是Firestore。检查文档中true中存储的任何内容时,更新了我的代码以返回false'username'值,并认为如果有人尝试检查'usernames',我将共享更新后的代码在其Firestore数据库中。

在UITextField上创建了一个扩展,当我需要检查用户名是否可用时调用该扩展:

func checkUsername(field: String, completion: @escaping (Bool) -> Void) {
    let collectionRef = db.collection("users")
    collectionRef.whereField("username", isEqualTo: field).getDocuments { (snapshot, err) in
        if let err = err {
            print("Error getting document: \(err)")
        } else if (snapshot?.isEmpty)! {
            completion(false)
        } else {
            for document in (snapshot?.documents)! {
                if document.data()["username"] != nil {
                    completion(true)
                }
            }
        }
    }
}

然后在UITextField textDidEndEditing上,我称该函数为活动字段是用户名字段:

func textFieldDidEndEditing(_ textField: UITextField) {

    if activeField == usernameField {
        if textField.text?.isEmpty == false {
            textField.checkUsername(field: textField.text!) { (success) in
                if success == true {
                    print("Username is taken")
                    // Perform some action
                } else {
                    print("Username is not taken")
                    // Perform some action
                }
            }
        }
    }

} 

如果我尝试输入任何文档'Username is taken'字段中存在的用户名,则返回username,如果未找到则返回'Username is not taken'

如果有人对改进代码或任何问题有任何反馈,请告诉我。我会很高兴地更新以供参考。 :)