Firebase结合查询和分页

时间:2016-09-20 04:03:20

标签: swift firebase firebase-realtime-database

查询可用于将大型商品过滤到适合与客户端同步的较小数量。
分页也有同样的目的,即将项目限制为适合客户提取的较小数字。

考虑以下数据库架构:

"users": {
    "-KRyXWjI0X6UvffIB_Gc": {
        "active": true,
        "name": "John Doe",
        "occupation": "Looking for firebase answer"
    },
    "-KRyXBWwaK112OWGw5fa": {
        "active": false,
        "name": "Jane Doe",
        "occupation": "Still stuck on combining query and pagination"
    },
    "-KRyWfOg7Nj59qtoCG30": {
        "active": true,
        "name": "Johnnie Doe",
        "occupation": "There is no greater sorrow than to recall in misery the time when we were stuck"
    }
}

如果我要获得所有活跃用户,它将是这样的:( Swift中的代码)

let usersRef = ref.child("users");
let query = usersRef.queryOrderedByChild("active")
                    .queryEqualToValue(true)

在过滤之后,它给我留下了10,000个用户。同时获取所有这些用户是不可能的。它必须是分页的。

要进行分页,我必须对唯一排序值进行查询,该值不是本身。这就是它现在的样子:

let usersRef = ref.child("users");
let query = usersRef.queryOrderedByChild("active")
                    .queryEqualToValue(true)

let usersPerPage = 10;
query.queryOrderedByKey()
     .queryStartingAtValue(lastKey)
     .queryLimitedToFirst(usersPerPage)

这不起作用,因为:

  

您一次只能使用一个order-by方法。拨打订单   多次在同一查询中抛出一个错误。

在我花了两天时间思考如何解决这种情况之后,我才能想出这个“反最佳实践”解决方案。

我修改了数据库架构。我将活动布尔值转换为字符串,并将其附加到键后面,以便为键提供顺序重要性控制。这就是它现在的样子:

"users": {
    "-KRyXWjI0X6UvffIB_Gc": {
        "key_active": "-KRyXWjI0X6UvffIB_Gc true"
        "active": true,
        "name": "John Doe",
        "occupation": "Looking for firebase answer"
    }
}

现在我可以使用单个orderBy:

进行分页和查询
let usersPerPage = 10;
query.queryOrderedByChild("key_active")
     .queryStartingAtValue("\(lastKey) true")
     .queryLimitedToFirst(usersPerPage)

不知怎的,我的大脑拒绝在中包含的想法,因为它可能是最糟糕的肮脏解决方案。我想知道针对这种特殊情况的正确解决方案,我们将非常感谢任何解决方案。

1 个答案:

答案 0 :(得分:0)

只需将其添加到您的JSON树: -

PreferredLanguages

在此之后,只需按照以下答案: - Retrieving 5 user's at a time,根据您的要求进行修改。

注意: - 通过执行子项计数来检索该答案中的用户/帖子总数。鉴于您的数据库繁重,您可能希望将totalNoOfUser存储在单独的节点中,并在每次添加新用户时将其递增。