如何通过PagedRdbQuery获取分页查询的最大页数?
获取PagedRdbQuery的最大页数高效解决方案
你之前用遍历所有页面的方法确实完全不适合百万级数据的场景——不仅慢得离谱,还会占用大量内存,而且返回9999的问题大概率是因为循环没法正确终止(毕竟数据持续新增的话,理论上永远追不上最后一页?或者是PagedRdbQuery的IsLastPage判断逻辑需要实际加载数据后才会更新,导致循环陷入异常)。
好在Ideablade提供了更高效的方式,不需要遍历所有数据就能拿到总记录数,进而算出最大页数:
核心思路:直接查询数据库总记录数
PagedRdbQuery自带的Count()方法会直接生成SELECT COUNT(*) FROM ...的SQL语句,在数据库端执行统计,完全不会加载任何实体到内存,性能拉满,非常适合百万级数据场景。
示例代码
private int GetMaxPagesOfRdbQuery(PagedRdbQuery query) { // 获取实时总记录数,仅执行COUNT查询,不加载实体 int totalRecords = query.Count(); // 计算总页数,用向上取整的方式处理余数情况 // 比如301条数据、每页100条,(301+100-1)/100 = 400/100 = 4页 int maxPages = (totalRecords + query.PageSize - 1) / query.PageSize; // 处理无数据的边界情况,至少返回1页(避免显示0页的尴尬) return maxPages > 0 ? maxPages : 1; }
额外说明
- 这个方法是实时性的:每次调用都会重新查询数据库的当前总记录数,完美适配数据持续新增的场景;
- 性能优势:百万级数据的COUNT查询在数据库端通常只需要几十毫秒,和遍历所有数据的分钟级耗时完全不在一个量级;
- 为什么之前的遍历方法失效?因为PagedRdbQuery的
IsLastPage属性需要实际加载当前页的数据后才能正确判断,而如果数据持续新增,你永远追不上最后一页,循环会一直跑下去(直到触发某些内部限制,比如返回9999)。
内容的提问来源于stack exchange,提问作者DConner4
相关产品推荐
相关产品推荐

