Android Studio - 值必须≥ 0

Android Studio - Value must be ≥ 0

我在 Android Studio 中遇到有关我的光标的错误。

我的代码中有以下行

String data = cursor.getString(cursor.getColumnIndex(columnIndex));

正在将 columnIndex 传递到方法中。

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

值必须≥0

它发生在我的 DBHelper class 和我的回收器适配器中,当它也使用游标时。

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

有什么想法吗?

感谢您的帮助。

21 年 9 月 22 日更新

我正在按要求添加一些代码以及我是如何解决这个错误的。不确定这是否是最好的方法。

所以我使用的方法是这个....

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;
}

我遇到过这样的错误。
我的解决方案:将方法 getColumnIndex 更改为 getColumnIndexOrThrow.

问题是 cursor.getColumnIndex() 可以 return -1,您将其作为直接参数传递,并且游标获取器需要列索引 gte 0。获取器的参数已注释@IntRange(from = 0) 这就是为什么 lint 将其标记为错误的原因。

因此,即使 you 可能已经构建了您的项目,使其永远不会产生无效的列索引,但这种可能存在的事实是 lint 标记它的原因.

您的代码修改只是避免了这个问题。最好使用 cursor.getColumnIndexOrThrow() 或测试 index for gte 0.

您可以摆脱更改,因为您比 lint 更了解您的项目,这不是最佳实践。

正确使用此方法:-

@SuppressLint("Range") 强名称 = cursor.getString(cursor.getColumnIndex(indexNumber));