我正在尝试了解以下代码在哪里出了问题。我试图寻找一种方法来检查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'
。
我在这里想念什么?我假设它没有正确查询数据库?
答案 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'
。
如果有人对改进代码或任何问题有任何反馈,请告诉我。我会很高兴地更新以供参考。 :)