【问题标题】:How do you queryOrderedByValue on a key that is auto-generated in Swift?如何在 Swift 中自动生成的键上查询OrderedByValue?
【发布时间】:2018-07-11 15:30:58
【问题描述】:

我需要在其密钥是自动生成的节点上queryOrderedByValue()。我的数据库结构如下图所示(/users-pings/$uid/$uid/"auto-id")。

我可以对下面的查询进行哪些更改以实现此目的?

REF_USERS_PINGS.child(currentUid).child(forId).queryOrderedByValue().queryEqual(toValue: "true").observeSingleEvent(of: .value) { (snapshot) in


            if snapshot.exists(){

                handler(true)

            } else {

                handler(false)
            }

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    Firebase 数据库查询在您运行它们的位置下的每个子节点上运行,因此在您的情况下它们会自动跳过 user-pings 下的第三级。

    您只需要指定要排序/过滤的属性,这里似乎是active。所以像:

    REF_USERS_PINGS.child(currentUid).child(forId).queryOrdered(byChild: "active").queryEqual(toValue: "true").observeSingleEvent(of: .value) { (snapshot) in
    

    【讨论】:

    • 啊哈!这完全有道理,而且奏效了! - 非常感谢您的帮助:)
    • 一个简单的问题:如果我想添加一个额外的订单/过滤器(例如;类型),我可以将额外的queryOrdered(byChild: "type").queryEqual(toValue: "compliment") 绑定到查询吗?
    • @Roggie 否。查询仅针对单身儿童。 Uou 无法查询 where active = true and type = 恭维。但是您可以存储复合值并对其进行查询。例如,将另一个子节点添加到您的结构中:type_active:“compliment_true”。注意:您的结构中的潜在问题;将 bool 值存储为不等于 true 的字符串“true”,因此如果您查询它时要小心,就好像您正在寻找 true 的布尔值一样,您不会找到它。查看compound value
    • 正如 Jay 所说,Firebase 数据库查询只能对单个属性进行排序/过滤。在许多情况下,可以将要过滤的值组合成一个(合成)属性。有关此方法和其他方法的示例,请在此处查看我的答案:stackoverflow.com/questions/26700924/…
    【解决方案2】:

    您需要使用queryOrderedByKey() 仅返回与该 id 相关的结果:

    REF_USERS_PINGS.child(currentUid).child(forId).queryOrderedByKey().queryEqual(toValue: "-LH72MNIVX8o4KI3V9nL").observeSingleEvent(of: .value) { (snapshot) in
    

    更多信息在这里:

    https://firebase.google.com/docs/database/ios/lists-of-data#data_order

    【讨论】:

    • 感谢您的建议,但这并不能解决问题,LH72MNIVX8o4KI3V9nL 是自动生成的,因此不会提前知道此值。
    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多