Firebase实时数据库中的分页

时间:2019-12-20 18:45:50

标签: android firebase-realtime-database pagination

我使用的是Firebase实时数据库,对NoSQL来说还很陌生。这里是我的数据库结构示例。

Sample database Json tree
我想通过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);
    }

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

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

但是失败了。有人可以告诉我如何正确编写查询。

1 个答案:

答案 0 :(得分:1)

FirebaseDatabase.getInstance(firebaseApp)
    .getReference("resources")
    .child(FSeason.key)
    .orderByKey()
    .startAt(id)
    .limit(size)

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

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

  

创建一个约束,以仅返回具有值的子节点的查询   使用给定的orderBy大于或等于给定的值   指令或默认优先级。

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