【发布时间】:2018-07-13 23:32:41
【问题描述】:
我正在尝试了解以下代码可能出错的地方。我试图寻找一种方法来检查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 的用户名,因此尝试输入 test 应返回 'Username exists',输入 testtwo 应返回 'Username does not exist'。
我在这里可以缺少什么?我假设它没有正确查询数据库?
【问题讨论】:
-
您将问题标记为 Cloud Firestore,但在代码中使用了 Firebase 实时数据库。这两个数据库完全不同,你用的是哪一个?
-
Firestore :) 如果我尝试检查实时数据库而不是 Firestore 数据库,我认为这就是问题所在。
-
是的,这绝对行不通。请务必在此处查看有关获取文档的 Firestore 文档:firebase.google.com/docs/firestore/query-data/get-data
-
谢谢!现在看看我需要修改什么?关于这一点,最好在创建用户时将所有用户名放入一个名为“用户名”的单独集合中,所以我只需要查询集合中的文档,而不是单独查询每个文档以获取具有用户名?
-
性能方面几乎相同,所以我会选择最简单的解决方案。
标签: ios swift firebase google-cloud-firestore