我对Swift和Firebase相对较新,我正在寻找一种方法来查询Firebase数据库以查找特定值 . 在我正在开发的应用程序的上下文中,当用户注册时,他必须选择用户名,并且我们想要在数据库中验证没有其他用户已经拥有所选用户名 . 我的数据库结构如下:
假设我在应用程序中注册,我希望我的用户名为“mike” . 我希望应用程序搜索数据库中的所有“用户名”字段,以检查是否已经“mike”,但我的Firebase代码不起作用:
let queryRef = FIRDatabase.database().reference().child("users")
queryRef.queryOrdered(byChild: "username")
.queryEqual(toValue: self.username.text)
.observeSingleEvent(of: .value, with: { snapshot in
if snapshot.exists()
{
print(snapshot)
}
})
“快照输入”之后的所有内容甚至都没有执行(它跳过指令集) . 目前,在进行实际检查之前,我只是测试尝试打印“快照”值,但它永远不会打印出来 .
我将数据库规则设置为如此,因为任何试图查询它的人都需要访问“用户名”密钥:
{
"rules": {
"users": {
"$uid": {
"email": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid",
},
"username": {
".read": true,
".write": "$uid === auth.uid",
}
}
}
}
}
对于我来说,除了“用户名”键之外,保持所有内容都很重要 . 在这个例子中,为了简单起见,我只有“电子邮件”和“用户名”键,但在我的实际应用程序中,我有更多(名字,姓氏,出生日期,电话号码等)
在这一点上的任何帮助将不胜感激 . 非常感谢你
1 回答
我不认为这是可能的 .
来自Firebase文档:
在您的情况下,当您尝试按
username
进行过滤但是没有父节点users
的规则时,您将无法完成过滤,因为它将因 PERMISSION_DENIED 而失败 .您可以访问
users/a_valid_uid/username
,因为整个路径是可访问的 .你可以做的一个解决方法就是让一个单独的节点只包含用户名,并让公众可以阅读 .
您可以查看有关Firebase规则here的完整文档 .
注意:您可以在部署规则之前使用Firebase规则模拟器测试规则 .