首页 文章

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

提问于
浏览
3

我对Swift和Firebase相对较新,我正在寻找一种方法来查询Firebase数据库以查找特定值 . 在我正在开发的应用程序的上下文中,当用户注册时,他必须选择用户名,并且我们想要在数据库中验证没有其他用户已经拥有所选用户名 . 我的数据库结构如下:

Image of DB structure

假设我在应用程序中注册,我希望我的用户名为“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 回答

  • 1

    我不认为这是可能的 .

    来自Firebase文档:

    规则以原子方式应用 . 这意味着如果在该位置或授予访问权限的父位置没有规则,则读取或写入操作会立即失败 . 即使可以访问每个受影响的子路径,在父位置读取也将完全失败 .

    在您的情况下,当您尝试按 username 进行过滤但是没有父节点 users 的规则时,您将无法完成过滤,因为它将因 PERMISSION_DENIED 而失败 .

    您可以访问 users/a_valid_uid/username ,因为整个路径是可访问的 .

    你可以做的一个解决方法就是让一个单独的节点只包含用户名,并让公众可以阅读 .

    您可以查看有关Firebase规则here的完整文档 .

    注意:您可以在部署规则之前使用Firebase规则模拟器测试规则 .

相关问题