我对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",
}
}
}
}
}
对我来说,除了"用户名"键。在这个例子中,我只有#34;电子邮件"和"用户名"键是为了简单起见,但在我的实际应用程序中,我有更多的方法(名字,姓氏,出生日期,电话号码等)
此时的任何帮助将不胜感激。 非常感谢你
答案 0 :(得分:1)
我认为这不可能。
来自Firebase文档:
规则以原子方式应用。这意味着如果在该位置或授予访问权限的父位置没有规则,则读取或写入操作会立即失败。即使可以访问每个受影响的子路径,在父位置读取也将完全失败。
在您的情况下,当您尝试按username
进行过滤但父节点users
没有规则时,您将无法完成过滤,因为 PERMISSION_DENIED将失败强>
您可以访问users/a_valid_uid/username
,因为整个路径都是可访问的。
你可以做的解决方法是让一个单独的节点只包含用户名,并让公众可以阅读。
您可以查看有关Firebase规则here的完整文档。
注意:您可以在部署规则之前使用Firebase规则模拟器测试规则。