获取 Firebase 用户中最小的孩子

Posted

技术标签:

【中文标题】获取 Firebase 用户中最小的孩子【英文标题】:Get youngest child in Firebase users 【发布时间】:2018-03-15 07:45:42 【问题描述】:

我想在我的用户列表中找到最年轻的用户并加载他们的数据:姓名、个人资料图片和当前工作分配。我已阅读有关查询数据的 Firebase 入门,但他们的示例对我不起作用,因为我的数据组织方式不同。我有一个额外的子层。

这是我在 Firebase 中的 JSON 树:

我尝试加载用户列表,然后遍历它们以找到最年轻的用户,但这似乎有点过头了。 Firebase 文档让我觉得我应该能够通过 Firebase 方法进行查询,例如“queryOrderedByChild”或类似方法。

我已经查看了旧文档 here 和新文档 here,但我仍然不知道该怎么做。

这就是我的工作流程:

该应用会在“成员”列表中找到最年轻的用户,并加载他们的姓名、头像、生日等。他们将从工作列表中进行选择。一旦该用户从可用工作列表中进行选择,该应用就会从“成员”列表中加载下一个最年轻的用户,依此类推,直到所有用户都已加载并有机会选择工作。

我认为更好的工作流程是这样的:

    利用 Firebase 查询获取最年轻的用户 使用该查询加载该用户(图像和名称)

我该怎么做呢?

编辑 #1:我尝试过的代码

func loadExistingUsers(completion: @escaping ([[String : Any]]) -> ()) 
    var dictionary = [[String : Any]]()
    ref.child("members").observeSingleEvent(of: .value)  (snapshot: FIRDataSnapshot) in
        for child in snapshot.children 
            let snap = child as! FIRDataSnapshot
            if let value = snap.value as? [String : Any] 
                dictionary.append(value)
            
        
        completion(dictionary)
    

然后在 ViewDidLoad 中:

loadExistingUsers  (dictionary) in

        var youngestBirthday = 19000101
        var userName = "Sophie"

        for item in dictionary 
            let fetchedBirthday = item["birthday"] as! Int
            let fetchedName = item["firstName"] as! String

            if fetchedBirthday > youngestBirthday 
                youngestBirthday = fetchedBirthday
                userName = fetchedName
            
        
        print(userName,youngestBirthday)
    

此方法返回我的用户列表中最年轻的用户,但要获得我想要的东西似乎还有很长的路要走。我必须首先从 Firebase 获取用户,然后解析快照,然后创建一个数组,然后对数组进行排序,然后获取用户名。我的印象是 Firebase 可以通过一个查询完成所有这些工作。我错了吗?

【问题讨论】:

你能展示你试过的代码吗? 已更新信息 请试试这个:ref.child("members").queryOrdered(byChild:"birthday").queryLim‌​ited(toFirst: 1).observe(.childAdded .... 并通过添加 print("Snapshot: \(snapshot)") 来查看快照中的内容 快照返回:Snapshot: Snap (Dad) birthday = 19780926; childParent = parent; firstName = Dad; gender = male; passcode = 1122; profileImageUrl = "https://firebasestorage.googleapis.com/..."; 所以这是最小的孩子? 【参考方案1】:

您可以使用此代码获取最小的孩子:(因为您最小的日期是最大的数字,所以我使用toLast

ref.child("members").queryOrdered(byChild:"birthday").queryL‌​im‌​ited(toLast: 1).observeSingleEvent(of: .childAdded, with:  (snapshot) in
                        if let value = snapshot.value as? [String: Any] 
                                let name = value["firstname"] as? String
                                //you can do for other values as well
                                print(name)

                        
                )

【讨论】:

完美。作品!与 observe 方法相关的 query 让我感到困惑。现在我懂了。谢谢!

以上是关于获取 Firebase 用户中最小的孩子的主要内容,如果未能解决你的问题,请参考以下文章

如何在firebase数据库中获取所有孩子的数据?

如何从孩子的 Firebase 获取数据?

在 Swift 3 中包含字典的 Firebase 进程子快照

如何在 Firebase 中获得上孩子?

如何从 uid Firebase 数据库中获取电子邮件地址?

如何从 Firebase android kotlin 获取所有具有特定价值的孩子?