ROOM 数据库 | 实现自定义 ContentProvider 具有条件的批量删除、查询功能
Demo
工具类
基于Android Room的安全SQL构建工具类实现,包含DELETE和SELECT示例,用于包含条件的delete和query。
Pair 方案
// 文件参考:app/src/main/java/com/xxx/xx/util/SqlBuilder.ktobject SqlBuilder {/*** 构建安全DELETE语句* @param table 目标表名* @param conditions WHERE条件表达式(不带WHERE关键字)* @param args 条件参数数组* @return Pair(first=完整SQL, second=参数数组)** 示例输入:* table = "user", * conditions = "age > ? AND name = ?", * args = ["18", "John"]* 输出:Pair("DELETE FROM user WHERE age > ? AND name = ?", ["18","John"])*/fun buildDelete(table: String,conditions: String? = null,args: Array<String>? = null): Pair<String, Array<String>> {val sql = StringBuilder("DELETE FROM $table")val params = mutableListOf<String>()conditions?.let {sql.append(" WHERE $it")args?.let { params.addAll(it) }}return Pair(sql.toString(), params.toTypedArray())}/*** 构建安全SELECT语句* @param table 目标表名* @param columns 查询列(默认*)* @param conditions WHERE条件表达式* @param args 条件参数* @param orderBy 排序子句* @return 完整SQL和参数数组*/fun buildQuery(table: String,columns: Array<String> = arrayOf("*"),conditions: String? = null,args: Array<String>? = null,orderBy: String? = null): Pair<String, Array<String>> {val sql = StringBuilder("SELECT ${columns.joinToString()}")sql.append(" FROM $table")val params = mutableListOf<String>()conditions?.let {sql.append(" WHERE $it")args?.let { params.addAll(it) }}orderBy?.let {sql.append(" ORDER BY $it")}return Pair(sql.toString(), params.toTypedArray())}
}
Pair(deleteSql.toString(), args.toTypedArray()) 是Kotlin中用于返回两个相关值的标准方式,具体解释如下:
1. Pair结构:
// 等价于创建一个包含两个元素的数据对象
data class SqlResult(
val sql: String,
val args: Array<String>
)
2. 实际作用:
- deleteSql.toString():将构建好的DELETE SQL语句转为字符串
- // 示例输出:"DELETE FROM ims_records WHERE status = ?"
- args.toTypedArray():将条件参数集合转为固定大小的数组
- // 示例输出:arrayOf("EXPIRED")
3. 使用场景(在DAO中的典型用法)
@Dao
interface DataDao {@RawQueryfun executeRaw(query: SimpleSQLiteQuery): Int// 调用示例fun deleteRecords(condition: Pair<String, Array<String>>) {executeRaw(SimpleSQLiteQuery(condition.first, condition.second))}
}
4. Q:为什么要用Pair而不是单独返回?<