You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:13:30