插入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
相关产品推荐
相关产品推荐

