【发布时间】:2016-05-07 09:16:54
【问题描述】:
我将 firebase 用于大型数据库,每个条目都使用 autoid 键。例如,要获取最后十个条目,我可以使用:
ref.queryLimitedToLast(10).observeSingleEventOfType(.Value, withBlock: { snapshot in
for item in snapshot.children {
//do some code to each item
}
})
但是,我一生都无法弄清楚如何在此之前仅获得十个条目。例如。如果数据库有 100 个条目,我的代码将返回 90-100,但是我将如何获得条目 80-90(例如,没有查询最后 20 个条目并丢弃一半,因为它似乎效率低下)?
编辑: 我最终使用了
ref.queryOrderedByChild("timecode").queryEndingAtValue(final).queryLimitedToLast(10).observeSingleEventOfType(.Value, withBlock: { snapshot in
for item in snapshot.children {
//do some code to each item, including saving a new value of 'final'
}
})
并将值“final”保存为上次更新的时间码。也就是说,首先我会得到结果,例如 90-100,并将 90 的时间码保存为最终值(减去一秒),然后将其用作结束值,等等......以找到结果 80-89。 正如 Jay 在下面描述的那样,但使用时间戳而不是索引号(因为它已经在里面了)
编辑 2: 另外,为了让它更好地工作,我还在数据库的 firebase 规则中添加了 ".indexOn": "timecode"
【问题讨论】:
-
有几种方法可以做到这一点,但一个超级简单的解决方案是简单地在另一个节点中保留一个 total_count 并在每个节点中保留一个索引。然后使用开始于和结束于。您还可以利用节点上的优先级变量来存储索引。您还可以使用transation 来计算您的节点数,然后使用 starter 和 end at 索引。
-
谢谢。我对此有所了解,但无法使其正常工作。如果可能的话,我想只从顶部的键中查询。我认为我所追求的被称为“分页”,我在 iOS 上找不到简单的方法,我不知道如何使用由 autoid 键结构化的数据来做到这一点。
-
我发布了一个答案来帮助它工作。这很简单,但如果您有任何问题,请告诉我。
-
@Richie,你的代码中的
final是什么?是数字还是时间戳?
标签: ios swift firebase firebase-realtime-database