Android Studio - 值必须≥ 0。

37
我在Android Studio中遇到了与我的Cursor相关的错误。 以下是我的代码中的一行:
String data = cursor.getString(cursor.getColumnIndex(columnIndex));

columnIndex被传递到该方法中。

cursor.getColumnIndex(columnIndex)这一部分会产生以下错误

值必须≥ 0

这发生在我的DBHelper类和使用cursor的回收器适配器中。

它显示为红色错误,但应用程序仍然可以构建和运行。

有任何想法吗?

感谢任何帮助。

更新22-Sep-21

根据请求,我正在添加一些代码以及我如何解决此错误。 不确定这是否是最好的方法。

所以我正在使用的方法是....

public String getTripInfo(String tableName, int tripNo, String columnIndex){
    String data = "";

    // Select all query
    String selectQuery = "SELECT * FROM " + tableName + " WHERE " + TRIP_DETAILS_TRIP_NUMBER + "=" + tripNo;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // Looping through all rows and adding to list
    if(cursor.moveToFirst()){
        do{
            data = cursor.getString(cursor.getColumnIndex(columnIndex));
        } while(cursor.moveToNext());
    }

    // Closing connections
    cursor.close();
    db.close();

    //Returning number plates
    return data;
}

错误出现在do while循环中。红色部分是“cursor.getColumnIndex(columnIndex))”。

我解决这个错误的方法是使用以下代码:

public String getTripInfo(String tableName, int tripNo, String columnIndex){
    String data = "";

    // Select all query
    String selectQuery = "SELECT * FROM " + tableName + " WHERE " + TRIP_DETAILS_TRIP_NUMBER + "=" + tripNo;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // Looping through all rows and adding to list
    if(cursor.moveToFirst()){
        do{
            int index = cursor.getColumnIndex(columnIndex);
            data = cursor.getString(index);
        } while(cursor.moveToNext());
    }

    // Closing connections
    cursor.close();
    db.close();

    //Returning number plates
    return data;
}

这意味着columnIndex有时是负数,请查看传递columnIndex的方法。表格列索引不能为负数或大于最后一列索引。 - Taha Körkem
感谢您的回复。根据文档,如下所示,可以返回-1。但我仍然不确定该怎么做才能修复此错误。您能否再解释一下?getColumnIndex(String columnName)返回给定列名称的从零开始的索引,如果列不存在,则返回-1。 - Justin
cursor.getColumnIndex接受一个字符串参数,该参数是表名,您可以获取其列索引。因此,您可以根据需要传递正确的参数。您能否分享与该问题相关的整个代码? - Taha Körkem
请提供足够的代码,以便其他人更好地理解或重现问题。 - Community
11
只需使用:cursor.getColumnIndexOrThrow(...)。原始问题是一个lint问题 - 运行./gradlew lint会显示此问题。这可能是最新的AS版本 - Arctic Fox 2020.3.1补丁2 - 在更新到此补丁版本之后,没有进行任何代码更改,因此无法构建项目 - 如果查看更改日志,它提到了关于lint检查的修复程序:https://androidstudio.googleblog.com/2021/09/android-studio-arctic-fox-202031-patch.html和https://issuetracker.google.com/issues/197146610?pli=1可能是这个原因... - Mark
显示剩余2条评论
3个回答

46

我遇到了这样的一个错误。
我的解决方法是:将方法getColumnIndex更改为getColumnIndexOrThrow


这不是来自@Mark的评论吗? - MindRoasterMir

36
问题在于cursor.getColumnIndex()可能会返回-1,如果直接将其作为参数传递,那么游标的getter需要一个大于等于0的列索引。这些getter的参数被注释为@IntRange(from = 0),这就是为什么lint标记它为错误的原因。
所以,即使可能已经构建了自己的项目以避免产生无效的列索引,但存在这种可能性的事实就是为什么lint会标记它。
你的代码修订只是避免了这个问题。最好使用cursor.getColumnIndexOrThrow()或测试index是否大于等于0。
你可以通过你的更改得到不错的结果,因为你比lint更了解你的项目,但这并不是最佳实践。

0

使用此方法可以正常工作:

@SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex(indexNumber));


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接