Android中使用SQLite时如何修复CursorIndexOutOfBoundsException并获取数据
Hey there! 刚接触Android SQLite踩点坑太正常了,我帮你捋捋这个CursorIndexOutOfBoundsException的问题~
核心原因:Cursor初始位置没处理对
这个异常几乎都是因为你直接从初始状态的Cursor里取值了——刚查询出来的Cursor默认指向第一条数据的前面(索引为-1),根本没指向任何有效行,这时候直接调用getInt()、getString()之类的方法肯定会报错。
正确的Cursor处理姿势
不管你是查单条还是多条数据,都要先做这几步:
- 先判断Cursor是否非空且存在有效数据
- 移动光标到有效行(比如
moveToFirst()) - 读取数据后一定要关闭Cursor,避免内存泄漏
给你写个getSkip函数的正确示例,你可以对照着改:
public SkippedQuestions getSkip(int targetQuestionId) { SQLiteDatabase db = this.getReadableDatabase(); SkippedQuestions skippedItem = null; // 定义要查询的列,避免查所有列浪费资源 String[] projection = { COLUMN_ID, COLUMN_QUESTION_ID, COLUMN_QUESTION_CONTENT // 替换成你实际的列名 }; // 查询条件 String selection = COLUMN_QUESTION_ID + " = ?"; String[] selectionArgs = {String.valueOf(targetQuestionId)}; Cursor cursor = db.query( SkippedQuestions.TABLE_NAME, projection, selection, selectionArgs, null, null, null ); try { // 先移动到第一行,同时判断是否有数据 if (cursor != null && cursor.moveToFirst()) { skippedItem = new SkippedQuestions(); // 注意:getColumnIndex()要传入正确的列名,别拼错 skippedItem.setId(cursor.getInt(cursor.getColumnIndex(COLUMN_ID))); skippedItem.setQuestionId(cursor.getInt(cursor.getColumnIndex(COLUMN_QUESTION_ID))); skippedItem.setQuestionContent(cursor.getString(cursor.getColumnIndex(COLUMN_QUESTION_CONTENT))); } } finally { // 不管有没有查到数据,都要关闭Cursor和数据库连接 if (cursor != null) { cursor.close(); } db.close(); } return skippedItem; }
额外要检查的点
- 确认数据真的保存进去了:可以用Android Studio的Device File Explorer找到你的数据库文件(路径是
data/data/你的应用包名/databases/),导出后用SQLite可视化工具打开,看看表里有没有你保存的记录 - 列名别拼错:比如你类里的常量
COLUMN_QUESTION_ID和建表语句里的列名要完全一致(大小写敏感哦) - 如果查多条数据:要用
while (cursor.moveToNext())循环遍历每一行,而不是只调用一次moveToFirst()
小建议
如果之后项目复杂度上来,推荐用Android官方的Room框架代替原生SQLite——它会自动帮你处理Cursor的细节,还能做编译期语法检查,能少踩很多这种基础坑~不过刚学原生SQLite的话,先把这些基础搞扎实也很有价值!
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

