【问题标题】:Query items between x and y with Firebase使用 Firebase 查询 x 和 y 之间的项目
【发布时间】:2015-08-19 10:42:59
【问题描述】:

所以,我使用的是官方的 Hacker News API,它托管在 Firebase 上。

我遇到的问题是我想获得列表的一个子集。

一路走来。 let topNewsRef = firebase.childByAppendingPath("topstories").queryLimitedToFirst(UInt(batchSize + offset)).queryLimitedToLast(UInt(batchSize))

[我知道这不起作用,但我想要这种效果]。基本上我想要一个集合的一个子集,由一个范围指定;例如从第 2 项到第 15 项]。

假设我想要第 75 项中的 50 项,但上述方法不起作用。所以问题是;怎样才能达到同样的效果?

例如;给出 Firebase 中 100 个项目的列表。我想要 50 号和 75 号的所有项目。没有属性可以泄露项目的顺序。

这是我目前的解决方案;

        let topNewsRef = firebase.childByAppendingPath("topstories").queryLimitedToFirst(UInt(batchSize + offset))
    var handle: UInt?
    handle = topNewsRef.observeEventType(.Value) { (snapshot: FDataSnapshot!) -> Void in
        if let itemIDs = snapshot.value as? [Int] {
            itemIDs.dropFirst(offset) // This drops all items id I already fetched ...
            for itemID in itemIDs {
                let itemRef = self.firebase.childByAppendingPath("item/\(itemID)")
                var itemHandle: UInt?
                itemHandle = itemRef.observeEventType(.Value, withBlock: { (snapshot: FDataSnapshot!) -> Void in
                    if let itemHandle = itemHandle {
                        itemRef.removeObserverWithHandle(itemHandle)
                    }

                    if let json = snapshot.value as? [String:AnyObject],
                        // Handle JSON ...
                    }
                })
            }
        }
        if let handle = handle {
            topNewsRef.removeObserverWithHandle(handle)
        }
    } // offset += batchSize

... 这是从开始(偏移)到结束(batchSize + 偏移)的所有项目,然后我将列表的第一端删除偏移的大小。因此,在列表中留下了 batchSize 的大小。

【问题讨论】:

  • 您不会调用任何 queryOrderedBy...,这就是 Firebase 文档中的示例所做的:firebase.com/docs/ios/guide/… 这不是问题,然后“不工作”是非常广泛的。它有什么作用?你期望它做什么?如果您显示观察和处理事件类型的块,我也可能很有用。
  • queryLimitedToFirst() 和 queryLimitedToLast() 不能串联使用。使用其中一种。您正在寻找与 queryOrderedBy*() 一起使用的 startAt() 和 endAt()
  • 您需要再次阅读我的问题。你们俩。我无法按任何顺序查询,因为数据已经排序并且不在我的控制之下。没有属性(例如 id)或其他类似的东西。
  • 我不确定我是否理解这个问题。无论如何,我在example plnkr 中尝试了一下。我意识到这是在 JavaScript 中,但也许它会有所帮助。这是否与您正在尝试做的事情一致?总而言之,我一次获得两个/topstories,下载topstory 引用的/item 的值,并推送/topstories 的侦听器。
  • 它似乎正在工作。项目的值会在 Firebase 实例中更新时更新。 javascript 中的查询是var query = ref.orderByKey().startAt(''+$scope.options.offset).endAt(''+($scope.options.offset+$scope.options.batchSize-1)); -- 整数被更改为字符串,因为startAt()endAt() 参数在与orderByKey() 一起使用时需要是字符串。

标签: ios swift firebase


【解决方案1】:

按照我们的 cmets 回答您的问题,

您可以将.queryOrderedByKeyqueryStartingAtValue:queryEndingAtValue: 结合使用

/topstories 中的数据存储为数组。当按键排序时,数组中对象的索引是键。然后,您需要做的就是将offsetbatchSize 转换为字符串并将它们传递给queryStartingAtValue:queryEndingAtValue:,如下所示:

ref.queryOrderedByKey().queryStartingAtValue(String(offset)).queryEndingAtValue(String(offs‌​et+batchSize-1));
  • 如果要按批次大小增加偏移量,请不要忘记为 endValue 减 1。
  • 对于系列中的第 n 个查询,
    • startingAtIndex = initialOffset + (batchSize * (n - 1))
    • endingAtIndex = initialOffset + (batchSize * n) - 1
  • 例如,让batchSize=100 和初始offset=0。
    • 前 100 项是键 0 到 99。数组中第一项的 key(索引)是 0
    • 如果您查询 endingAt(offset+batchSize),您将在索引 100 处结束,这是数组中的第 101 项。
    • 因此,您将获得 101 个项目 - 比您的批量大小多一个。
    • 然后,第二个查询将针对索引为 100-199 的项目(从 0+batchsize 开始,到 0+batchsize+batchsize-1 结束),即 100 个项目。

这是在 JavaScript 中实现的相同概念的 example PLNKR

:)

【讨论】:

    【解决方案2】:

    好的,所以问题通过以下查询解决了。

    firebase.childByAppendingPath("topstories").queryOrderedByKey().queryStartingAtValue(String(offset)).queryEndingAtValue(String(offset + batchSize - 1))
    

    问题是 Firebase 文档没有指定“AnyObject!”参数可以用作查询的索引。他们也忘了提到索引应该是字符串类型。

    【讨论】:

    • 检查我上面的编辑——不要忘记从 endValue 中减去 1(或在下一个偏移量上加 1)。否则你会遇到一个错误的错误。
    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多