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

Posted

技术标签:

【中文标题】Firebase 查询(在 Swift 中)在应用的所有用户中查找特定值【英文标题】:Firebase query (in Swift) to find specific value within all users of an app 【发布时间】:2017-03-15 01:29:48 【问题描述】:

我对 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 规则模拟器在部署规则之前对其进行测试。

【讨论】:

以上是关于Firebase 查询(在 Swift 中)在应用的所有用户中查找特定值的主要内容,如果未能解决你的问题,请参考以下文章

Swift Firebase 查询最多需要一分钟

查询和 Firebase 中的位置(swift 3)

Firebase queryEqualToValue 在 Swift 2.3 中获取密钥

如何使用 Swift 在 Firebase 中使用 equalTo 查询查找子节点? [复制]

根据特定值查询子节点(Swift 3、Firebase)

Swift - 如何在 Firebase 上将排序查询创建为降序?