我将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'
}
})
并保存价值'最终'作为上次更新的时间码。也就是说,首先我会得到结果,90-100,比如说,并将90的时间码保存为最终值(减去一秒),然后将其用作结束值等,以找到结果80-89。 就像Jay在下面描述的那样,但是使用时间戳而不是索引号(就像它已经在那里一样)
编辑2: 另外,为了让它更好地工作,我还添加了" .indexOn":" timecode"到数据库的firebase规则
答案 0 :(得分:1)
您是否尝试过堆叠查询?
ref.queryLimitedToLast(20).queryLimitedToFirst(10).observeSingleEventOfType(.Value, withBlock: { snapshot in
for item in snapshot.children {
//do some code to each item
}
})
只是一个想法,哈哈。
答案 1 :(得分:1)
有几种方法可以做到这一点,但一个简单的解决方案是将total_count保存在另一个节点中,并在每个节点中保留一个索引。
然后使用queryStartingAtValue和queryEndingAtValue查询您感兴趣的子节点范围。
当您将孩子添加到“帖子”中时例如,将节点添加到total_count节点并保存。随着时间的推移,您将拥有100个帖子,而total_count节点的值将为100.然后您可以查询任何范围的帖子:.queryStartingAtValue(80)和。 queryEndingAtValue(89),或.queryStartingAt(20)和.queryEndingAt(30)
例如,假设有45个帖子(这里只显示其中的4个)
posts
...
post_1024
text: "my post!"
index: 42
post_1025
text: "another post"
index: 43
post_1026
text: "yippee"
index: 44
post_1027
text: "Stuff and Things"
index: 45
然后是一个跟踪它们的节点
post_info
total_count: 45
以及查询中间两个节点的代码
let ref = myRootRef.childByAppendingPath("posts"
ref.queryOrderedByChild("index").queryStartingAtValue(43).queryEndingAtValue(44)
.observeEventType(.Value, withBlock: { snapshot in
print(snapshot.key)
})
,输出为
post_1025
text: "another post"
index: 43
post_1026
text: "yippee"
index: 44
话虽如此,根据您的数据发生的情况,这可能会略微多余。如果您从不删除帖子,那么您需要进行设置。但是,如果您删除帖子,那么您的索引中显然存在差距(42,43,.. 45),因此需要考虑其他因素。
您甚至可能不需要total_count - 它只取决于您的应用的工作方式。
您还可以利用节点上的优先级变量来存储索引,而不是将其作为子节点。
带有.Value和.numChildren的Transitions和.observeSingleEvent也可用于获取实时节点数。