调用Cursor.getColumnIndex方法报错Value must be ≥ 0问题求助
报错原因分析
- 核心触发点是
queryCursor.getString(queryCursor.getColumnIndex("products"))这行代码:Android系统的Cursor.getColumnIndex()方法在找不到指定列名时会返回-1,而getString()方法要求传入的列索引参数必须≥0,传入负数就会抛出你遇到的Value must be ≥ 0异常。 - 列查找失败的常见原因包括:
- 你的
TABLENAME对应的数据表中,根本不存在名为products的字段 - 列名大小写不匹配:SQLite列名大小写敏感(具体取决于建表时的配置),如果实际字段是
Products/PRODUCTS,写小写products就会匹配失败
- 你的
- 代码额外问题:你当前是只读查询逻辑,全程没有调用
beginTransaction()开启事务,多余的ProductDatabase.setTransactionSuccessful()调用也可能引发额外的运行时异常。
修复建议
- 先核对建表语句的字段定义,确认列名的拼写、大小写完全匹配
- 推荐改用
getColumnIndexOrThrow()代替getColumnIndex(),列不存在时会直接抛出明确的「列未找到」异常,排查更直观 - 增加索引合法性校验,示例修改如下:
int productColumnIndex = queryCursor.getColumnIndex("products"); if (productColumnIndex >= 0) { String product = queryCursor.getString(productColumnIndex); productList.add(product); }
- 删除无用的
ProductDatabase.setTransactionSuccessful()代码行。
内容的提问来源于stack exchange,提问作者Quentin Ramecourt
相关产品推荐
相关产品推荐

