rawQuery
使用方法详解rawQuery
方法rawQuery
是 Android 中 SQLiteDatabase
类提供的方法,用于执行 原始 SQL 查询语句,并返回一个 Cursor
对象,它适用于需要 复杂查询逻辑(如多表联查、自定义排序、聚合函数等)的场景。
场景 | 说明 |
---|---|
复杂条件查询 | 需要动态拼接 SQL 或包含复杂逻辑(如 GROUP BY 、HAVING ) |
自定义排序 | 通过 ORDER BY 指定排序规则 |
多表联查 | 涉及 JOIN 操作时需用原始 SQL |
分页查询 | 配合 LIMIT 和 OFFSET 实现分页 |
public Cursor rawQuery(String sql, String[] selectionArgs)
sql
: 完整的 SQL 查询语句,支持 占位符。selectionArgs
: 按顺序填充 占位符的值,字符串会自动加上单引号。cursor.close()
,避免内存泄漏。selectionArgs
中的值需与 SQL 中的占位符类型一致(如数字无需加引号)。// 查询年龄大于 25 且名字为 "Alice" 的用户 String sql = "SELECT FROM users WHERE age > ? AND name = ?"; String[] args = {"25", "Alice"}; Cursor cursor = db.rawQuery(sql, args); // 遍历结果 while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); // 处理数据... } // 关闭 Cursor cursor.close();
问题 | 原因 | 解决方案 |
---|---|---|
查询结果为空 | SQL 语法错误或条件不匹配 | 检查 SQL 语句和 selectionArgs 的值 |
抛出 IllegalArgumentException | selectionArgs 数量与 占位符不匹配 | 确保数组长度与占位符数量一致 |
内存泄漏 | 未关闭 Cursor | 在 finally 块中调用 cursor.close() |
rawQuery
和 query
方法有什么区别?解答:
rawQuery
执行 原始 SQL,适合复杂查询(如多表联查、自定义排序)。 query
是 预定义方法,仅支持简单查询(WHERE
条件、SELECT
列),内部会自动处理 SQL 拼接和防注入。query
,复杂逻辑用 rawQuery
。rawQuery
导致的内存泄漏?解答:
cursor.close()
。 Cursor cursor = null; try { cursor = db.rawQuery(sql, args); // 处理数据... } finally { if (cursor != null) cursor.close(); }