Ios Firebase查询(在Swift中)在应用程序的所有用户中查找特定值

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

我对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)
            }
        })
“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规则模拟器测试规则