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

插入SQLite数据后查询无结果,结果集未返回数据(附代码)

排查SQLite查询无结果的问题

嘿,咱们一步步来解决你遇到的这个查询不到数据的问题!先看你的代码,第一个显眼的问题就是直接拼接SQL字符串——这不仅有SQL注入的安全风险,还大概率是导致你查询空结果的根源。下面是具体的排查和修复方案:

1. 优先修复SQL字符串拼接问题(核心解决点)

如果你的参数(比如question_id)里包含单引号'这类特殊字符,直接拼接会让SQL语法彻底出错,自然查不到任何数据。必须改用参数化查询,用?作为占位符来传递参数:

public boolean isExist(String question_id, String selected_option, String session_id) { 
    db = this.getReadableDatabase(); 
    // 用?占位符替代直接字符串拼接,避免语法错误和注入风险
    String query = "SELECT * FROM " + TABLE_TEST_START + 
                   " WHERE question_id_test_start = ? " +
                   " AND selected_option_test_start = ? " +
                   " AND test_start_id = ?";
    // 将参数放入字符串数组,按占位符顺序传递
    Cursor cur = db.rawQuery(query, new String[]{question_id, selected_option, session_id}); 
    boolean exist = (cur.getCount() > 0); 
    Log.d("DATA PRESENT ","DATA CHECK"+exist); 
    cur.close();
    // 注意:不要在方法内直接关闭db!如果这是全局数据库实例,频繁开闭会导致异常,建议统一管理连接
    // db.close(); 
    return exist; 
}

2. 确认数据是否真的插入成功

有时候你以为数据已经插入,但实际上插入操作可能失败了:

  • 检查你的插入代码,是否调用db.insert()/db.execSQL()后没有捕获异常?可以在插入后打印日志或者返回的插入ID,确认数据是否真的写入了表中。
  • 用SQLite可视化工具(比如DB Browser for SQLite)直接打开你的数据库文件,查看TABLE_TEST_START表的内容,确认目标数据是否存在。

3. 核对表名和字段名的拼写

SQLite虽然默认大小写不敏感,但拼写错误依然会导致查询失败:

  • 检查TABLE_TEST_START常量的取值,是否和建表语句中的表名完全一致?
  • 核对question_id_test_start、selected_option_test_start、test_start_id这些字段名,有没有少写下划线、拼错字母的情况?

4. 检查数据类型匹配问题

如果字段类型和你传入的参数类型不匹配,也会导致查询不匹配:

  • 比如如果test_start_id是INTEGER类型,但你插入和查询时都用了字符串参数,就可能出现匹配失败的情况,需要确保参数类型和字段定义完全一致。

5. 优化数据库资源管理

你在方法内直接关闭db的做法有问题,如果这是全局的数据库实例,频繁开闭会引发连接异常。建议用try-with-resources自动释放资源:

public boolean isExist(String question_id, String selected_option, String session_id) { 
    boolean exist = false;
    // try-with-resources会自动关闭Cursor和db连接
    try (SQLiteDatabase db = this.getReadableDatabase();
         Cursor cur = db.rawQuery("SELECT * FROM " + TABLE_TEST_START + 
                                 " WHERE question_id_test_start = ? " +
                                 " AND selected_option_test_start = ? " +
                                 " AND test_start_id = ?", 
                                 new String[]{question_id, selected_option, session_id})) {
        exist = cur.getCount() > 0;
        Log.d("DATA PRESENT ","DATA CHECK"+exist); 
    } catch (Exception e) {
        e.printStackTrace();
    }
    return exist; 
}

内容的提问来源于stack exchange,提问作者Chinmay Moharana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:22:26