如何使用SQLiteDatabase的query方法按指定字符串查询数据?
如何用SQLiteDatabase的query方法指定字符串查询数据
嘿,我看到你在尝试查询标题为lunch的食谱数据,不过你的代码里有两个需要调整的地方,咱们一步步来修正:
1. 原代码的问题分析
你写的RECIPE_COLUMN_TITLE+" =lunch"存在两个关键问题:
- 字符串值
lunch没有用单引号包裹,SQL会把它识别为列名而非字符串值,直接导致查询不到预期数据; - 直接拼接字符串存在SQL注入风险,而且如果查询的字符串包含特殊字符(比如单引号),会直接引发SQL语法错误。
2. 推荐的安全写法:参数化查询
Android的SQLiteDatabase.query方法支持用占位符?来绑定参数,这是查询字符串的最佳实践,既安全又能避免语法错误。修改后的代码如下:
public ArrayList<RecipeInfo> getTypeRecipe() { ArrayList<RecipeInfo> recipeInfo = new ArrayList(); Cursor cursor = null; try { // 定义WHERE子句,用?作为字符串占位符 String selection = RECIPE_COLUMN_TITLE + " = ?"; // 传入占位符对应的实际值,框架会自动处理转义 String[] selectionArgs = {"lunch"}; cursor = db.query(TABLE_RECIPES_NAME, TABLE_RECIPE_COLUMNS, selection, selectionArgs, null, null, null); cursor.moveToFirst(); while (!cursor.isAfterLast()) { RecipeInfo ri = cursorToRecipes(cursor); recipeInfo.add(ri); cursor.moveToNext(); } } catch (Throwable t){ t.printStackTrace(); } finally { // 务必关闭Cursor,避免资源泄漏 if (cursor != null) { cursor.close(); } } return recipeInfo; }
3. 为什么推荐参数化查询?
- 自动转义特殊字符:比如你要查询的是
lunch's special,参数化方式会自动处理单引号,不会导致SQL语法错误; - 防止SQL注入:避免恶意构造的字符串破坏你的数据库或泄露数据;
- 代码更易维护:参数和查询逻辑分离,可读性更强。
4. 不推荐的字符串拼接方式(仅作了解)
如果一定要用字符串拼接,记得给字符串值加上单引号,但这种方式存在安全隐患,不建议使用:
// 仅作示例,不推荐在实际项目中使用 cursor = db.query(TABLE_RECIPES_NAME, TABLE_RECIPE_COLUMNS, RECIPE_COLUMN_TITLE+" = 'lunch'", null, null, null, null);
内容的提问来源于stack exchange,提问作者Idan Kloppfer
相关产品推荐
相关产品推荐

