Firebase 实时数据库中的分页

Nim*_*nka 1 pagination android firebase-realtime-database

我正在使用 Firebase 实时数据库并且对 NoSQL 非常陌生。这是我的数据库结构示例。

示例数据库 Json 树
我想通过 REST GET 方法获取所有季节。类似于下面的代码段。

 @GetMapping(value = "seasons", params = {"page", "size"})
    public ResponseEntity<List<SeasonDTO>> getAllSeasons(@RequestParam("page") int page, @RequestParam("size") int size) {
        ResponseEntity<List<FSeason>> fSeasons = DBHandle.retrieveDataList(FSeason.class, dbRef.child(FSeason.key).orderByKey().limitToFirst(page * size).limitToLast((page + 1) * size));
       ........
        List<SeasonDTO> map = modelMapper.map(fSeasons.getBody(), seasonDTOListType);
        return new ResponseEntity<>(map, HttpStatus.OK);
    }
Run Code Online (Sandbox Code Playgroud)

我尝试实现数据库查询,如:

FirebaseDatabase.getInstance(firebaseApp).getReference("resources").child(FSeason.key).orderByKey().limitToFirst(page * size).limitToLast((page + 1) * size)
Run Code Online (Sandbox Code Playgroud)

但失败了。有人可以告诉我 Query 应该如何正确编写。

Chr*_*ona 6

FirebaseDatabase.getInstance(firebaseApp)
    .getReference("resources")
    .child(FSeason.key)
    .orderByKey()
    .startAt(id)
    .limit(size)
Run Code Online (Sandbox Code Playgroud)

在这里,startAt(...)将在您的数据库中设置游标。这些数据的顺序由您的orderByKey()函数定义,该函数按字母顺序对数据进行排序。此外,该limit(...)函数定义了每个查询要检索的数据量。

这是关于startAt(...)的官方文档:

创建一个限制为仅返回值大于或等于给定值的子节点的查询,使用给定的 orderBy 指令或优先级作为默认值。

idstartAt(id)表示最后一个检索到的文档的ID。因此,每次解析查询结果时,请存储最后一个元素的 id 并将其用于下一个查询。