如何在 swift 4.0 中获取 firebase-realtime-database 中的特定值

Posted

技术标签:

【中文标题】如何在 swift 4.0 中获取 firebase-realtime-database 中的特定值【英文标题】:How to get a specific value in firebase-realtime-database in swift 4.0 【发布时间】: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)
    
)

【问题讨论】:

【参考方案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 如果我的回答帮助您找到了解决方案,请接受它以便帮助其他人!

以上是关于如何在 swift 4.0 中获取 firebase-realtime-database 中的特定值的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4.0 Eventkit 无法正确获取日历和事件

如何使用 Swift 获取一天中的时间?

如何在 Xcode 9.3 中切换到 Swift 4.0?

比较一个结构的两个值并在 UITableView swift 4.0 中获取额外的单元格

如何在 Swift 4.0 中将 JSON 输出设置为 UILabel?

如何在UICollectionView Swift 4.0中正确调整和扩展单元格的大小和居中