我正在尝试检查数据库中是否已经存在用户名。
这是我为此编写的代码。
func textFieldDidEndEditing(_ textField: UITextField) {
//check if username is already taken in the database
let username = self.usernameTextField.text!
let reference = Database.database().reference().child("activeUsernames")
let query = reference.queryOrdered(byChild: "username").queryEqual(toValue: username)
let banner = StatusBarNotificationBanner(title: " The username \(username) is not available.", style: .danger)
let successBanner = StatusBarNotificationBanner(title: "The username \(username) is available.", style: .success)
query.observe(.value, with: { (DataSnapshot) in
if DataSnapshot.exists() {
print("Darn username already exists")
banner.show()
} else {
print("Yes I can use this username")
successBanner.show()
}
}, withCancel: nil)
}
到目前为止,它的工作方式不一致。有时,如果我输入一个已经存在的用户名,则打印语句"Yes I can use this username"
显然已经被使用时会出现,有时它会告诉我它已经被使用。我注意到我在控制台中得到了这个声明
使用未指定的索引。您的数据将在客户端上下载并过滤。考虑将/ activeUsernames处的“ .indexOn”:“用户名”添加到安全规则中,以提高性能
我不确定这是否导致检查不一致。但是,我不确定如何有效地更改或编辑安全规则。
如果有帮助,这是我用于活动用户名的数据结构,仅显示用户uid和与该uid相关的用户名。
- activeUsernames
6GpUz3iLwmWdDrlMtf7tT0yAULw2
username:
8sRfoqa4dKYzUKGdIZAtwE6NQZH2
username:
SRY4xUmRMgXbLL7GfsxosF6sS1y2
username:
这也是安全规则
"rules": {
".read": true,
".write": true
}
}
答案 0 :(得分:2)
要摆脱此消息,请将您的规则更改为:
{
"rules": {
".read": true,
".write": true
"activeUsernames": {
".indexOn": "username"
}
}
}
这告诉Firebase服务器在username
下的/activeUsernames
上添加索引,从而使其能够在服务器上而不是在客户端上执行排序/过滤。
答案 1 :(得分:1)
最好的方法是创建一个云函数,该函数将检查用户名是否已使用,并仅返回true或false。