在swift中查询firebase数据库的mid-section

时间:2016-05-07 09:16:54

标签: ios swift firebase firebase-realtime-database

我将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规则

2 个答案:

答案 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也可用于获取实时节点数。