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

Android Studio开发SQLite cursor.getColumnIndex需大于0报错问询

问题定位步骤
  • 核对数据库表结构与字段调用名称
    先查看SQLiteOpenHelper实现类的onCreate方法中建表语句的字段名,确认和cursor.getColumnIndex()传入的参数字符串完全匹配,注意如果建表时用引号指定了大小写,调用时必须严格对应大小写,拼写、下划线差异都会导致返回-1触发报错。
  • 检查查询语句的返回列范围
    查看你调用query()/rawQuery()执行查询时指定的返回列集合,确认没有漏写你要读取的字段,如果查询时只指定了返回id、address两个字段,读取user_name字段时自然会返回无效索引。
  • 确认Cursor状态合法性
    调用字段读取方法前,要保证Cursor不为空,且已经通过moveToFirst()/moveToNext()返回true确认移动到了有效数据行,异常状态下的Cursor也可能出现索引读取异常。
修复方案

推荐先把表字段定义为全局常量,建表、查询、读取都复用同一常量,从根源避免拼写错误:

// 数据库常量统一管理
public static final String TABLE_ADDRESS = "address";
public static final String COLUMN_ID = "id";
public static final String COLUMN_USER_NAME = "user_name";
public static final String COLUMN_DETAIL_ADDR = "detail_addr";

// 优化后的Cursor转实体方法
private Address cursorToAddressAttributeGroup(Cursor cursor) {
    Address address = new Address();
    // 先判断索引有效性再读取字段
    int idIndex = cursor.getColumnIndex(COLUMN_ID);
    if (idIndex >= 0) {
        address.setId(cursor.getInt(idIndex));
    }
    int nameIndex = cursor.getColumnIndex(COLUMN_USER_NAME);
    if (nameIndex >= 0) {
        address.setUserName(cursor.getString(nameIndex));
    }
    int addrIndex = cursor.getColumnIndex(COLUMN_DETAIL_ADDR);
    if (addrIndex >= 0) {
        address.setDetailAddr(cursor.getString(addrIndex));
    }
    return address;
}

如果调整后依旧报错,可以卸载APP重装一次测试:SQLiteOpenHelper的onCreate方法仅在数据库首次生成时执行,如果你修改了建表语句但没删除本地旧数据库,旧表结构不会更新,也会触发字段不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:06:03