Ios Firebase查询(在Swift中)在应用程序的所有用户中查找特定值
我对Swift和Firebase比较陌生,我正在寻找一种查询Firebase数据库以找到特定值的方法。在我正在开发的应用程序中,当用户注册时,他必须选择一个用户名,我们希望在数据库中验证没有其他用户已经选择了用户名。我的数据库结构如下所示: 假设我正在应用程序中注册,我希望我的用户名为“mike”。我希望应用程序在数据库的所有“用户名”字段中搜索,以检查“mike”是否已被使用,但我的Firebase代码不起作用:Ios Firebase查询(在Swift中)在应用程序的所有用户中查找特定值,ios,swift,search,firebase,firebase-realtime-database,Ios,Swift,Search,Firebase,Firebase Realtime Database,我对Swift和Firebase比较陌生,我正在寻找一种查询Firebase数据库以找到特定值的方法。在我正在开发的应用程序中,当用户注册时,他必须选择一个用户名,我们希望在数据库中验证没有其他用户已经选择了用户名。我的数据库结构如下所示: 假设我正在应用程序中注册,我希望我的用户名为“mike”。我希望应用程序在数据库的所有“用户名”字段中搜索,以检查“mike”是否已被使用,但我的Firebase代码不起作用: let queryRef = FIRDatabase.database().r
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)
}
})
“snapshot in”之后的所有内容都不会执行(它会跳过指令集)。现在,在执行实际检查之前,我只是测试是否尝试打印“快照”值,但从未打印过
我将数据库规则设置为这样,因为任何试图查询“username”键的人都需要访问它:
{
"rules": {
"users": {
"$uid": {
"email": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid",
},
"username": {
".read": true,
".write": "$uid === auth.uid",
}
}
}
}
}
对我来说,除了“用户名”密钥外,保持所有内容的私密性是很重要的。在这个例子中,为了简单起见,我只有“email”和“username”键,但在我的实际应用程序中,我有更多的键(名字、姓氏、出生日期、电话号码等)
在这一点上的任何帮助都将不胜感激。
非常感谢我认为这是不可能的 从Firebase文档中: 规则是以原子的方式应用的。这意味着,如果该位置或父位置没有授予访问权限的规则,则读或写操作将立即失败。即使每个受影响的子路径都是可访问的,在父位置的读取也将完全失败 在您的情况下,当您尝试按
用户名进行筛选时,但没有针对父节点用户的规则,您将无法完成筛选,因为它将因权限被拒绝而失败
您可以访问users/a\u valid\u uid/username
,因为整个路径都是可访问的
作为一种解决方法,您可以使用一个单独的节点,该节点只包含用户名,并使其可供公众阅读
您可以查看有关Firebase规则的完整文档
注意:在部署规则之前,您可以使用Firebase规则模拟器测试规则