【问题标题】:How to get a specific value in firebase-realtime-database in swift 4.0如何在 swift 4.0 中获取 firebase-realtime-database 中的特定值
【发布时间】:2018-09-19 07:10:43
【问题描述】:

我在 swift 4.0 中尝试在 firebase-realtime-database 中获取特定值时遇到问题

这是我想要获取的存储在变量中的值

let value = 12345678

这是我的 firebase 数据库的样子

我想找到与我的变量具有相同值的 trackId,然后获取该 trackId

我花了整整一个星期来解决这个问题,我似乎无法解决它,任何帮助将不胜感激。

这是我目前的代码

let questionPostsRef = self.ref.child("questionPosts")
let query = questionPostsRef.queryOrdered(byChild: "trackId").queryEqual(toValue: "12345678")
query.observeSingleEvent(of: .value, with: { snapshot in
    for child in snapshot.children {
        let childSnap = child as! DataSnapshot
        let dict = childSnap.value as! [String: Any]
        let cat = dict["category"] as! String
        let name = dict["name"] as! String
        print(childSnap.key, cat, name)
    }
})

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database swift4


    【解决方案1】:

    这是一个标准的 Firebase 查询。

    为了检索包含具有特定值的子节点的节点,我们在节点中查询相关节点键并指定要查找的值。它们将在快照中返回,并且它们可能不止一个,因此我们需要遍历每个返回的快照。

    let questionPostsRef = self.ref.child("questionPosts")
    let query = questionPostsRef.queryOrdered(byChild: "trackId").queryEqual(toValue: "12345678")
    query.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children {
            let childSnap = child as! DataSnapshot
            let dict = childSnap.value as! [String: Any]
            let cat = dict["category"] as! String
            let name = dict["name"] as! String
            print(childSnap.key, cat, name)
        }
    })
    

    输出将是(假设找到两个)

    -Lu9ma9jsd...  some category   some name
    -K999a90k9...  some category   some name
    

    这在 Firebase 指南中有所介绍:Work With Lists Of Data 在排序和过滤部分

    现在,问题说明

    我想找到与我的变量具有相同值的 trackId 并且 然后得到那个trackId

    当然,如果您已经知道 trackId,则无需获取它,因为您已经拥有它。我的猜测是您想要返回与该轨道 ID 匹配的节点,以便您可以获取其他数据,这就是上面的代码所做的。如果您要问不同的问题,请告诉我。

    编辑:OP 的后续行动。要配置 Firebase,这是视图控制器中的典型设计模式。从那里,您可以在整个课程中使用 self.ref 引用您的 Firebase(如我上面的回答)

    import UIKit
    import Firebase
    import FirebaseAuth
    import FirebaseDatabase
    import FirebaseStorage
    
    class ViewController: UIViewController {
        var ref: DatabaseReference!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.ref = Database.database().reference()
    

    【讨论】:

    • 当我运行你的代码时,它给了我这个错误使用未指定的索引。您的数据将在客户端下载和过滤。考虑添加 ".indexOn" : "trackId" 我将 dict["category"] 和 dict["name"] 配置为正确的值,但它仍然 不起作用
    • @umapp 这并不是一个真正的错误——它提醒您在 Firebase 中使用索引,因为它显着提高了查询性能。见Sorting and filtering data。我的问题中的代码确实有效,因为它是从项目复制和粘贴的,而我包含的输出是从控制台复制和粘贴的。为了测试,我在 Firebase 中输入了您的确切结构并运行了代码。说它不起作用并不能真正帮助我们帮助您 - 具体来说,进行一些挖掘并检查错误,确定哪些部分不起作用以及原因。
    • @umapp 对我来说不一样。我在答案中包含了控制台输出,以显示您应该在控制台中看到的内容。如果您没有看到,那么您还有其他问题;确保您的结构与您在问题中包含的结构相同。请注意 self.ref 指向 my firebase,因此您应该将 self.ref 设置为指向 your firebase。确保您已通过身份验证和/或具有允许您读取数据的规则。除此之外,代码运行良好。
    • 我已经检查了我的数据库结构,它完全一样,除了控制台中的警告说 **Using an unspecified index 之外,我没有显示任何内容。您的数据将在客户端下载和过滤。考虑将 /questionPosts 中的 ".indexOn": "trackId" 添加到您的安全规则中以获得更好的性能**
    • @umapp 如果我的回答帮助您找到了解决方案,请接受它以便帮助其他人!
    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 2021-12-06
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多