所以我有一个运动应用程序,处理比赛和锦标赛数据。 我有两个使用相同数据的显示器:
数据结构如下
- championships
- libertadores
- name: Libertadores da América
- matches
- 2j6g42kjhg62
- champ: libertadores
- time: 1433962855
- <data> //teams, scores, stadium and so on
现在,展示未来的比赛很简单:
matchesRef.queryOrderedByChild("time").queryStartingAtValue(currentTimestamp)
.queryLimitedToFirst(20)
.observeEventType(.ChildAdded, withBlock: { (snapshot) in
// code
})
但是,因为你不能使用多个queryOrderedByChild
,所以我坚持将其与锦标赛的过滤相结合。
我考虑过更改我的数据结构以支持/championship/matches/<matchID>
这样的内容,但这会让我很难显示所有未来的匹配。
此处不选择过滤器,那么如何才能达到预期效果?
答案 0 :(得分:3)
知道了!
在发布问题之前,我已经阅读了文档,但没有点击该信息引导我找到解决方案。
关于结构化数据的这一部分包含答案:https://www.firebase.com/docs/ios/guide/structuring-data.html
理解: 自然结构将是:
- champs
- champID
- matches
- matchID
- <matchData>
- champName
但是,要使用firebase,我们需要规范化数据:
- champs
- champID
- champName
- matches
- matchID
- champID
- timestamp
- <matchData>
我开始提问的结构是什么。
然而,由于锦标赛有比赛和比赛属于锦标赛,我们需要交叉参考他们两个。上面链接的文档告诉我们可以给键值true
,因为我们对键的值不感兴趣,只是它存在。但是,因为我只需要将来的匹配,所以解决方案是将匹配时间戳放在值中。
- champs
- champID
- matches
- matchID: timestamp
- champName
- matches
- matchID
- champID
- timestamp
- <matchdata>
现在最后的代码:
非过滤视图:
// Query non-filtered matches Reference
matchesRef.queryOrderedByChild("time").queryStartingAtValue(currentTimestamp)
.queryLimitedToFirst(20).observeEventType(.ChildAdded, withBlock: { (snapshot) in
// code
})
过滤后的观点:
// Query filtered matches
champsRef.childByAppendingPath(champKey).childByAppendingPath("matches")
.queryOrderedByValue().queryStartingAtValue(currentTimestamp)
.queryLimitedToFirst(20)
.observeEventType(.ChildAdded, withBlock: { (snapshot) in
let key = snapshot.key
matchesRef.childByAppendingPath(key).observeSingleEventOfType(.Value, withBlock: { (matchSnapshot) in
// code
})
})
答案 1 :(得分:0)
在firebase中,您只能过滤queryOrderedBy(child: String)
键。在我的情况下,我需要过滤多个日期范围(每个都是UITableView
中的一个部分),并在这些排序中单独的字段。解决方案是使用FUISortedArray
,它采用sortDescriptor (DataSnapshot, DataSnapshot) -> ComparisonResult