Индекс курсора Android вне связанного исключения

что-то не так с этим кодом, я хочу запросить данные с помощью штрих-кода, и он показывает мне, что исключение Cursor Index out of Bound.

public String getIdByBarcode(String ss) throws SQLException{
    String[] column = new String[]{Pro_ID,Pro_Barcode, Pro_Name,Pro_NameKhmer, Pro_Quantity, Pro_Price, Pro_Description, Pro_Date};
    Cursor c = ourDatabase.query(TABLE_NAME, column, Pro_Barcode + "= '" + ss + "' " , null, null, null, null);

    if(c != null){
        c.moveToFirst();
        String id = c.getString(0);
        Log.v(id, id + "Id" );
        return id;
    }
    return null;
}

person user2149618    schedule 13.07.2013    source источник


Ответы (3)


Нет результатов в Cursor. Вы должны проверить, что возвращает moveToFirst() (скорее всего, false). Также вы должны использовать moveToNext(), а не moveToFirst(). Также обратите внимание, что вы не проверяете параметр ss. Это может привести к уязвимостям SQL-инъекций. Вы должны использовать параметры. Также я думаю, что вы можете использовать один возврат в своем методе.

public String getIdByBarcode(String ss) throws SQLException {
    String[] column = new String[]{Pro_ID,Pro_Barcode, Pro_Name,Pro_NameKhmer, Pro_Quantity, Pro_Price, Pro_Description, Pro_Date};
    final String args = new String[1];
    args[0] = ss;
    Cursor c = ourDatabase.query(TABLE_NAME, column, Pro_Barcode + " = ?" , args, null, null, null);
    String ret = null;
    if(c.moveToNext()) {
        ret = c.getString(0);     
    }
    return ret;
}
person m0skit0    schedule 13.07.2013

Литература метода moveToFirst():

public abstract boolean moveToFirst () Переместите курсор в первую строку. Этот метод вернет false, если курсор пуст.

Возвращает успешность перемещения.

Таким образом, ваш вызов moveToFirst терпит неудачу (потому что cusrsor имеет 0 элементов), и это является причиной сбоя.

Сделай это:

if(c != null && c.moveToFirst()) {
    String id = c.getString(0);
    Log.v(id, id + "Id" );
    return id;
}
person Rajeev    schedule 13.07.2013

попробуй это

String id;
if (c!= null && c.moveToNext){
   String id = c.getString(0);
   return id;   
 }
person Srikanth Roopa    schedule 13.07.2013
comment
Использование while здесь просто не имеет смысла. id всегда будет получать последний элемент. Не говоря уже о том, что id недоступен извне цикла... - person m0skit0; 13.07.2013