如何按价值降序从firebase获取数据?

Posted

技术标签:

【中文标题】如何按价值降序从firebase获取数据?【英文标题】:How to get data from firebase in descending order of value? 【发布时间】:2017-07-17 07:05:01 【问题描述】:

我想获得前 10 名用户的游戏高分,并将其显示在表格视图中。

leaderboards
 CQVudhI2OjTfNbqWOWi2T1DTWKw2
 HIGH-SCORE: 23
 PLAYER-NAME: Russell
 REACTION-TIME: .9
 SWIPES: 12

 F9IbjpVSE8g5YN3PX0sdhSNGULJ3
 HIGH-SCORE: 29
 PLAYER-NAME: Clayton
 REACTION-TIME: .87
 SWIPES: 22

 HDIHCUSJDHCJHZKSHJXH
 HIGH-SCORE: 89
 PLAYER-NAME: Damien
 REACTION-TIME: .77
 SWIPES: 32

 jdhsjdbwkjsdkahnkdnk232j3j2
 HIGH-SCORE: 43
 PLAYER-NAME: Christopher
 REACTION-TIME: .99
 SWIPES: 32

在表格视图中,我希望显示前 10 名得分最高者的姓名和得分。

任何帮助将不胜感激。谢谢

【问题讨论】:

【参考方案1】:

Firebase 不提供通过查询反转排序顺序的任何方法。但是,如果您将分数存储为负值,则非常简单。

这是一个结构

scores
  score_0
     amt: -20
  score_1
     amt: -10
  score_2
     amt: -12
  score_3
     amt: -1
  score_4
     amt: -22

然后是读取前三个“高”分数的代码 22,然后是 20 和 12

    let scoresRef = self.ref.child("scores")
    let queryRef = scoresRef.queryOrdered(byChild: "amt").queryLimited(toFirst: 3)

    queryRef.observeSingleEvent(of: .value, with:  snapshot in   
        for child in snapshot.children 
            let snap = child as! DataSnapshot
            print(snap.value)
        
    )

和输出

Optional(
    amt = "-22";
)
Optional(
    amt = "-20";
)
Optional(
    amt = "-12";
)

当然,如果分数数量有限,也可以将它们读入数组并进行排序。

为了完整起见,如果您不想将分数存储为负值,请按以下方式操作。

    let scoresRef = self.ref.child("scores")
    let queryRef = scoresRef.queryOrdered(byChild: "amt").queryLimited(toLast: 3)

    queryRef.observeSingleEvent(of: .value, with:  snapshot in

        var scoresArray = [Int]()

        for child in snapshot.children 
            let snap = child as! DataSnapshot
            let score = snap.childSnapshot(forPath: "amt")
            scoresArray.append(score.value as! Int)
        

        scoresArray = scoresArray.reversed()
        print(scoresArray)
    )

上述代码通过 queryLimited(toLast) 读取三个最高值,即 12、20 和 22,并填充一个数组。数组可以反转,按 22、20 和 12 降序排列。

最后一个选择是将它们读取为 12、22、20,但将每个 amt 插入到位置 0 的数组中。因此 12 将位于索引 0,然后 22 将位于索引 0,而 12 将位于索引 1等等

【讨论】:

感谢大家的帮助!我所做的是做一个 querylimted(tolast 10) 这是我得到的 10 个最高分数,然后将它添加到一个数组并反转它。这被认为是足够好的代码吗? @russsellphillips 如果它有效,稳定且易于维护,那么绝对是的,它已经足够好了!如果我的回答有帮助,请采纳,这样也能帮助到其他人!【参考方案2】:

我认为您必须首先将所有 Databae 加载到一个结构数组中,将您的数组过滤到新数组中(如何做到这一点,检查here),然后在 tableView 上表示它。顺便说一句,如果您只是从 Firebase 开始,我强烈建议您阅读 this 教程。希望我的回答有用:)

【讨论】:

【参考方案3】:

这是另一种方法,您可以节省一些代码。从 firebase 检索时不要使用 append,而是使用 insert(newObject, at: 0)。

在代码中你可以看到我替换了:

scoresArray.append()

scoresArray.insert( score, at: 0)

完整代码:

var scoresArray = [Int]()
let scoresRef = self.ref.child("leaderboards")
let queryRef = scoresRef.queryOrdered(byChild: "HIGH-SCORE").queryLimited(toLast: 10)

queryRef.observeSingleEvent(of: .value, with:  snapshot in
  
  for child in snapshot.children 
    let snap = child as! DataSnapshot
    let score = snap.childSnapshot(forPath: "HIGH-SCORE").value as! Int
    scoresArray.insert( score, at: 0)
  

)

最初我从这里得到这个答案: https://www.youtube.com/watch?v=4y_NLkYT6NU

【讨论】:

以上是关于如何按价值降序从firebase获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android Firebase实时数据库中按降序获取孩子[重复]

如何从 Firebase 数据库中的 autoID 获取价值 - Swift

如何从 Xamarin 中的 Firebase 获取价值?

如何在 Firebase 中按降序排列数据 - Python

如何在另一个孩子 Firebase 中按孩子订购

Firebase 从数据库中获取价值