从实时数据库中正确排列检索大量数据

时间:2021-07-31 14:58:58

标签: java android database firebase firebase-realtime-database

在我的数据库中,我有大量的项目,不可能一次检索所有这些项目

例如我有 **Users list ** 其中包含 2000 个用户

像这样:

用户:

1-
    email:"user1@gmail.com"
2-
    email:"users2@gmail.com"
3-
    email:"user3@gmail.com"
4- 
    email:"user4@gmail.com"
5-
    email:"user5@gmail.com"
6-
    email:"user6@gmail.com"

*more users*...

2000:
    email:"user2000@gmail.com"

在我的应用程序中,我想检索最后 20 个,然后再检索最后 20 个,然后再检索 20 个,依此类推...

当我与limit_to_last(10)一起工作时 然后使用 mylist.add(0 , users)

它以正确的排列(降序方式)检索最后 10 个项目,项目从最后一个项目出现在列表中,然后在一个之前,然后像这样

2000
1999
1998
1997
1996
1995
1994
1993
1992
1991
1990

这个安排就是我想要的。

当我想检索更多项目时,我的问题就开始了... 我知道如何检索更多,但我不知道如何正确排列它们 当我加载更多项目时,它看起来像那样无序

2000
1999
1998
1997
1996
1995
1994
1993
1992
1991
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990

这意味着第一个加载的项目以降序排列,但第二个加载的项目以我不想要的升序排列。

如何使所有项目以相同的方式排列(降序方式)

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

如果您设法在每个用户的节点中存储一些增量值(负数),那么您也许可以按降序对它们进行排序并对结果进行分页。例如,让我们以这些数据为例:

1-
    email:"user1@gmail.com"
    userInt: -1
2-
    email:"users2@gmail.com"
    userInt: -2
3-
    email:"user3@gmail.com"
    userInt: -3
4- 
    email:"user4@gmail.com"
    userInt: -4

请注意,您必须确保此值的大小始终在增加,并且不应该对每个用户都相同。

之后,您可以使用带有 orderByChild("userInt")limitToFirst(2) 的查询来获取最新的 2 个用户。 对于后续查询,即您需要获取下 2 个最新用户,您可以添加 startAfter('lastUserInt'),在这种情况下 lastUserInt 将为 -3。 由于数字为负数且 Firebase 结果为升序的最新用户将首先被提取。

Query latestUsers = databaseReference.child("Users")
        .orderByChild("userInt")
        .startAfter(-3) // lastUserInt
        .limitToLast(2)