Как разрешить CursorIndexOutOfBounds - PullRequest
2 голосов
/ 21 ноября 2011

Это поставило меня в тупик.

Я продолжаю получать CursorIndexOutOfBounds при попытке выполнить этот конкретный запрос.

    Cursor c = db.rawQuery("SELECT * FROM table WHERE _id='2'" , null);

Но странным является то, что над этим запросом я запускаю цикл, который выводит все значения _id из этой таблицы. Он выводит от 1 до 100, так что я знаю, что значение там. Также я вывожу все столбцы, и они все там, как я и ожидал.

Хотя я почти уверен, что есть значения, и в правильных столбцах эта строка кода продолжает отбрасывать CursorIndexOutOfBounds. Может ли кто-нибудь предложить пути решения этой проблемы.

    numval = c.getInt(c.getColumnIndex("_id"));

Запись Logcat

11-21 11:35:09.367: ERROR/AndroidRuntime(11664): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

EDIT

Вот точный код, который я использую. Я все еще получаю сообщение об ошибке, которое я разместил чуть выше этого предложения.

    Cursor cur = db.rawQuery("SELECT * FROM table" , null);
    cur.moveToFirst();
    while (cur.isAfterLast() == false) {

        numval = cur.getInt(cur.getColumnIndex("_id"));
        String numvalval = Integer.toString(numval);
        Log.e("RESULT",numvalval);
        cur.moveToNext();
    }
    cur.close();
    Cursor ti = db.rawQuery("PRAGMA table_info(table)", null);
    if ( ti.moveToFirst() ) {
        do {
            Log.e("COLUMN NAMES","col: '" + ti.getString(1) +"'");
        } while (ti.moveToNext());
    }
    ti.close();
    Cursor c = db.rawQuery("SELECT * FROM table WHERE _id='2'" , null);
    c.moveToFirst();
                numval      = c.getInt(c.getColumnIndex("_id"));

вывод

11-21 13:27:25.906: ERROR/RESULT(13377): 1
11-21 13:27:25.906: ERROR/RESULT(13377): 2
11-21 13:27:25.910: ERROR/COLUMN NAMES(13377): col: '_id'
11-21 13:27:25.910: ERROR/COLUMN NAMES(13377): col: 'country'

Ответы [ 4 ]

2 голосов
/ 21 ноября 2011

См. Изменить, следующий совет больше не действует после того, как вы отредактировали вопрос.

Когда вы получаете объект Cursor, в начале вам следуетвсегда перемещайте это в первый ряд.Поэтому ваш код должен выглядеть следующим образом:

if(c.moveToFirst()) {
    numval = c.getInt(c.getColumnIndex("_id"));
}
else {
    /* SQL Query returned no result ... */
}

РЕДАКТИРОВАТЬ
Измените свой запрос на это (без кавычек вокруг '2'):

Cursor c = db.rawQuery("SELECT * FROM table WHERE _id=2" , null);
0 голосов
/ 21 ноября 2011
while (cur.isAfterLast() == false) {

- неправильный подход

while (cur.moveToNext()) {

-

Кроме того, у Cursor есть более специфические методы, чем rawQuery, вы должны использовать эти

0 голосов
/ 21 ноября 2011

Попробуйте использовать c.moveToFirst(); до numval = c.getInt(c.getColumnIndex("_id"));

0 голосов
/ 21 ноября 2011

Это означает, что вы обращаетесь к тому индексу, которого там нет, numval = c.getInt(c.getColumnIndex("_id")); Первым делом проверьте, что ваш курсор нулевой или нет if(c==null) или if(c.getCount>0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...