Android Studio Cursor getColumnIndex报Value must be ≥ 0错误求助
报错原因
这个是Android Studio的Lint静态检查触发的提示,不属于编译错误,因此应用可以正常构建运行。
Cursor.getColumnIndex(列名字符串)的返回值规则是:如果传入的列名不存在于当前Cursor的结果集中,就会返回-1;而Cursor.getString(下标)等取值方法要求传入的下标必须≥0,否则运行时会抛出异常,Lint正是检测到这个风险才给出报错提示。- 你把
getColumnIndex的返回值先赋值给本地变量再传入getString,本质只是绕过了Lint的检查规则,没有从根本上解决潜在的运行时风险。另外你当前的参数命名存在歧义,columnIndex实际是传入的列名字符串,不是下标,建议修改为columnName避免后续维护混淆。
正确修复方案
方案1:使用官方推荐的方法(最省心)
直接用getColumnIndexOrThrow替代getColumnIndex,这个方法如果检测到列不存在会直接抛出IllegalArgumentException,不会返回-1,Lint会识别它的返回值一定合法,自然消除报错:
data = cursor.getString(cursor.getColumnIndexOrThrow(columnName));
如果担心列不存在导致崩溃,可以在外层加try-catch捕获异常做兜底处理。
方案2:增加合法性判断(更稳妥)
就算你要保留中间变量的写法,也建议加下标的合法性校验,避免后续表结构变更、列名拼写错误等场景触发运行时崩溃:
public String getTripInfo(String tableName, int tripNo, String columnName){ String data = ""; String selectQuery = "SELECT * FROM " + tableName + " WHERE " + TRIP_DETAILS_TRIP_NUMBER + "=" + tripNo; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); if(cursor.moveToFirst()){ do{ int index = cursor.getColumnIndex(columnName); if (index >= 0) { data = cursor.getString(index); } else { // 可自行添加日志打印、默认值赋值等兜底逻辑 } } while(cursor.moveToNext()); } cursor.close(); db.close(); return data; }
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

