如何按价值降序从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