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

