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

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;
}
额外要检查的点
  1. 确认数据真的保存进去了:可以用Android Studio的Device File Explorer找到你的数据库文件(路径是data/data/你的应用包名/databases/),导出后用SQLite可视化工具打开,看看表里有没有你保存的记录
  2. 列名别拼错:比如你类里的常量COLUMN_QUESTION_ID和建表语句里的列名要完全一致(大小写敏感哦)
  3. 如果查多条数据:要用while (cursor.moveToNext())循环遍历每一行,而不是只调用一次moveToFirst()
小建议

如果之后项目复杂度上来,推荐用Android官方的Room框架代替原生SQLite——它会自动帮你处理Cursor的细节,还能做编译期语法检查,能少踩很多这种基础坑~不过刚学原生SQLite的话,先把这些基础搞扎实也很有价值!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:31:47