Android Room @Query如何实现可选limit参数 传null返回全量数据
实现方案
有两种成熟的实现方式,都可以满足需求。
方案1:单SQL语句条件判断(推荐,代码量最少)
直接修改@Query注解内的SQL语句,利用SQLite原生特性实现逻辑:
SQLite规则说明:
IFNULL(参数1, 参数2)函数:如果参数1为null则返回参数2,否则返回参数1- LIMIT子句传入
-1时,等价于不设置条数限制,返回所有匹配结果
修改后的Dao层代码如下:
@Query("SELECT * FROM user LIMIT IFNULL(:limit, -1)") suspend fun getUsers(limit: Int?): List<User>
执行逻辑:
- 传入
limit = 10时,IFNULL直接返回10,实际执行SELECT * FROM user LIMIT 10,返回10条用户数据 - 传入
limit = null时,IFNULL返回-1,实际执行SELECT * FROM user LIMIT -1,返回全量用户数据
方案2:方法重载(无SQL兼容问题,逻辑直观)
如果担心部分特殊场景下LIMIT -1的适配问题,可以拆分两个查询方法,通过统一入口做参数判断:
首先在Dao中写两个基础查询:
@Query("SELECT * FROM user") suspend fun getAllUsers(): List<User> @Query("SELECT * FROM user LIMIT :limit") suspend fun getUsers(limit: Int): List<User>
再写一个入口方法做参数分发:
suspend fun getUsers(limit: Int?): List<User> { return limit?.let { getUsers(it) } ?: getAllUsers() }
该方案的SQL都是最基础的写法,不存在版本兼容问题,执行逻辑和需求完全一致。
内容的提问来源于stack exchange,提问作者Saman Sattari
相关产品推荐
相关产品推荐

