【问题标题】:swift firebase query not working快速的firebase查询不起作用
【发布时间】:2018-03-14 00:08:08
【问题描述】:

我正在尝试从 swift 查询 firebase 实时数据库。

但是下面的代码不起作用。

var keyvalue = "somevalue"

Database.database().reference().child("users")
    .queryOrdered(byChild: "key1").queryEqual(toValue: keyvalue.lowercased())
    .observe(.value, with: {(snapshot)  in
        if snapshot.exists() {
            // do some action  
            // block1
        } else {
           // do some action if not exist 
           // block2
        }
    })

我将断点设置为“block1”、“block2”。 但代码未到达 block1 或 block2。 我的代码有什么问题?

Firebase 数据库结构如下。

{
  // some nodes..
  "users": {
    "auto_key1": {
      "key1": "key1val",
      "key2": "key2val"
    },
    "auto_key2": {
      "key1": "key1val",
      "key2": "key2val"
    }
    ....
  }
}

我认为这足以解释结构。

【问题讨论】:

  • 请编辑您的问题以在/users 处包含 JSON 的 sn-p(作为文本,无屏幕截图)。您可以通过单击Firebase Database console 中的“导出 JSON”链接来获取此信息。
  • @FrankvanPuffelen 谢谢。我已经更新了问题。
  • JSON 和代码中的值不匹配。但是假设这是一个错字(请始终创建一个有效的MCVE,这样我们就不必假设),监听器应该触发。您确定运行查询的用户有权读取数据吗?
  • 是的。有时这不会在数据库中。我的目标是检查值是否已经存在。例如,我将从文本字段中获取字符串,然后我需要检查“用户”节点的任何子节点是否具有该值
  • 我的目的是检查是否有“key1”的值完全相同。保持用户名等唯一值。

标签: swift firebase firebase-realtime-database


【解决方案1】:

我在 iPhone 7 (iOS 11.3) 中遇到了同样的问题。

但是当我在模拟器或其他 iPhone 中测试相同的代码时,一切都很好。

我也不知道为什么代码没有到达特定电话中的回调,但这不是您的代码的问题。

【讨论】:

    【解决方案2】:

    除非孩子的值等于“somevalue”,否则它不会返回孩子快照。从您的数据库来看,这是不可能的,因为您所有的“key1”键都具有“key1val”的值。

    【讨论】:

    • 那么如何检查值是否存在。
    • 如果您通过 key1 进行查询,那么它必须存在才能包含在查询中。如果您只想找出密钥是否存在,请使用相同的代码。取出queryEqualqueryOrdered 方法。并在观察部分使用if snapshot.hasChild("key1")
    • 那我需要在前面检查吗?
    • 基本上要执行查询,子 必须 存在才能被包含在内,并且您必须在数据库规则的某处包含 users: { ".indexOn": ["key1"] }
    • 另外,这个答案可能应该是评论,因为 OP 最有可能打错字 - 这应该是一个解决方案,而不是观察。
    猜你喜欢
    • 2016-10-12
    • 2020-06-06
    • 2017-10-13
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多