上一篇
安卓开发 数据库条件查询语句
- 行业动态
- 2025-04-21
- 4513
数据库条件查询语句核心语法
在安卓开发中,数据库条件查询主要通过WHERE
子句实现,以下是常见的条件表达式:
条件类型 | SQL 语法示例 | 说明 |
---|---|---|
等于 | column = ? | 精确匹配值(推荐使用占位符防止SQL注入) |
不等于 | column != ? | 排除指定值 |
模糊匹配 | column LIKE '%value%' | 使用通配符 进行模糊查询(如搜索包含关键词的文本) |
范围查询 | column BETWEEN ? AND ? | 查询介于两个值之间的数据(如时间范围、数值区间) |
多值匹配 | column IN (?, ?, ?) | 匹配多个指定值中的一个(如查询指定ID列表) |
空值判断 | column IS NULL | 筛选空值字段 |
组合条件 | condition1 AND condition2 | 使用逻辑运算符组合多个条件(如age > 18 AND city = 'Beijing' ) |
安卓中执行条件查询的两种方式
原生 SQLite 查询(SQLiteDatabase
)
// 示例:查询年龄大于18且城市为北京的用户 String sql = "SELECT FROM users WHERE age > ? AND city = ?"; Cursor cursor = db.rawQuery(sql, new String[]{"18", "Beijing"});
Room 持久化库查询
// 定义查询方法(支持条件参数) @Query("SELECT FROM user WHERE age > :minAge AND city = :city") List<User> getUsersByCondition(int minAge, String city); // 调用时传入参数 List<User> result = userDao.getUsersByCondition(18, "Beijing");
参数化查询防注入对比
方式 | 安全写法 | 风险写法(易被注入) |
---|---|---|
推荐方式 | SELECT FROM table WHERE id = ? | SELECT FROM table WHERE id = " + userId |
区别 | 使用占位符(?)自动转义特殊字符 | 直接拼接字符串可能导致SQL注入 |
动态条件查询实现方案
当查询条件不固定时,可通过以下方式动态构建:
// 示例:根据可选条件拼接SQL StringBuilder sqlBuilder = new StringBuilder("SELECT FROM products WHERE 1=1"); List<String> args = new ArrayList<>(); if (priceRange != null) { sqlBuilder.append(" AND price BETWEEN ? AND ?"); args.add(priceRange[0]); args.add(priceRange[1]); } if (category != null) { sqlBuilder.append(" AND category = ?"); args.add(category); } // 转换列表为数组 Cursor cursor = db.rawQuery(sqlBuilder.toString(), args.toArray(new String[0]));
常见问题与解答
问题1:如何防止SQL注入攻击?
解答:
始终使用参数化查询(占位符)或Room的参数绑定功能,避免直接拼接用户输入内容。
// 安全写法(参数化查询) String sql = "SELECT FROM users WHERE username = ?"; Cursor cursor = db.rawQuery(sql, new String[]{inputUsername});
问题2:如何实现多条件组合查询?
解答:
使用逻辑运算符(AND
/OR
)连接条件,并通过代码动态构建查询。
// 动态拼接条件 String whereClause = "status = ?"; String[] args = {"active"}; // 如果需要添加其他条件 if (dateNotNull) { whereClause += " AND date > ?"; args = Arrays.copyOf(args, args.length + 1); args[args.length 1] = "2023-01-01"; } // 执行查询 Cursor cursor = db.query("tasks", null, whereClause, args, null, null, null);