android room数据库动态拼接sql

前言

最近用room数据库的时候遇到了一个问题,如果直接按指定条件查询肯定没问题,在dao文件里直接编写sql,但是很多时候,比如各种记录查询,查询条件肯定不止一个,而且各种条件只是and的关系,不是每次查询都需要填写所有搜索条件,这就遇到了一个问题,怎么像mybatis的xml文件那样可以增加if判断,不为空再拼接这个条件呢?

解决

经过查看文档还是有办法的,就是再代码里动态拼接sql,代码如下

1
2
3
4
5
6
7
val sb = StringBuilder(" SELECT * FROM user ")
if (age != -1 || name.isNotBlank()) {
sb.append(" where ")
if (age != -1) {
sb.append("age $age")
}
}

拼接完sql后,构造 sqlSimpleSQLiteQuery(sb.toString())

dao中的代码

1
2
@RawQuery
fun find(sql:SupportSQLiteQuery): List<User>

使用方式:

1
Datebase.userDao().find(SimpleSQLiteQuery(sb.toString()))
总结

使用起来略显麻烦,需要增加各个条件的判断,但总归可以实现功能,希望后面google可以优化封装一下,像mybatis-plus的那种,纯代码使用,不需要再写sql