ios - Firestore/Swift 4:检查用户名是否存在?
问题描述
我试图了解以下代码可能出错的地方。我试图寻找一种方法来检查users
集合是否在字段中的一个文档中包含字符串username
。
结构看起来像这样
#users(collection)
#userID(document)
#name:String
#email:String
#username:String
#userID(document)
#name:String
#email:String
#username:String
我要检查的是字段中是否存在字符串users
,并且在任何范围内。通过调用一个函数来查询用户名,在这里找到了这个问题(以及其他)的可能解决方案。document,
username
我在扩展中创建了该函数:
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
,因此尝试输入 test 应该返回'Username exists'
并且输入testtwo
应该返回'Username does not exist'
。
我在这里可以缺少什么?我假设它没有正确查询数据库?
解决方案
感谢 Frank 指出我调用的是实时数据库而不是 Firestore。更新我的代码以在检查文档中存储的任何内容时返回一个true
或值,并认为如果其他人试图在他们的 Firestore 数据库中检查,我会分享我更新的代码。false
'username'
'usernames'
在 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'
没有找到任何内容,则会返回。
如果有人有任何反馈以改进代码或有任何问题,请告诉我。我很乐意更新以供参考。:)
推荐阅读
- python - 如何调整 MDDropdownMenu 中的文本大小?(kivymd,蟒蛇)
- webdriver - 无法使用 codeceptjs 启动 Chromium 边缘浏览器
- c# - FluentEmail 使用 Gmail 服务器身份验证错误
- python-3.x - 为什么pylance无法解析本地相对路径导入(VSCode)?
- python - WKBReadingError with PostGIS + Shapely with PostGIS Geography column (Unknown WKB type 233)
- .net - 了解 .Net Framework 4.5.2+ 服务终止
- vba - 遍历记录集中的电子邮件地址列表以发送定制的电子邮件
- python - 重新分类 pandas 列值
- sas - 通过 SAS 中的 SQL 查询显式 SQL 传递
- git - 是否已经有一个用于在给定分支“中”执行脚本的 git 命令?