Android - исключение курсора - индекс 1 запрошен с размером 1 - PullRequest
0 голосов
/ 08 сентября 2011

У меня есть следующий код:

private Cursor query(String selection, String[] selectionArgs,
        String[] columns, String tableName) {
    /*
     * The SQLiteBuilder provides a map for all possible columns requested
     * to actual columns in the database, creating a simple column alias
     * mechanism by which the ContentProvider does not need to know the real
     * column names
     */
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    builder.setTables(tableName);
    Cursor cursor = builder.query(mDatabase, columns, selection,
            selectionArgs, null, null, null);
    if (cursor == null) {
        return null;
    } else if (!cursor.moveToFirst()) {
        cursor.close();
        return null;
    }
    return cursor;
}

public List<VEvent> getVEvents(int week, int year) {
    String selection = KEY_WEEK + "=? AND " + KEY_YEAR + "=?";
    String[] selectionArgs = new String[] { String.valueOf(week), String.valueOf(year) };
    Cursor cursor = query(selection, selectionArgs, ALL_CALENDAR_COLUMNS, CALENDAR_TABLE_NAME);
    List<VEvent> events = new ArrayList<VEvent>();
    while (cursor != null) {
        VEvent e = new VEvent();
        try {
        e.getProperties().add(new Uid(cursor.getString(1)));
        e.getProperties().add(new DtStamp(cursor.getString(2)));
        e.getProperties().add(new Organizer(cursor.getString(3)));
        e.getProperties().add(new DtStart(cursor.getString(4)));
        e.getProperties().add(new DtEnd(cursor.getString(5)));
        e.getProperties().add(new Summary(cursor.getString(6)));
        e.getProperties().add(new Location(cursor.getString(7)));
        e.getProperties().add(new Description(cursor.getString(8)));
        events.add(e);
        } catch (ParseException ex) {
            Log.v("getvevents", "parse exception : " + ex.getLocalizedMessage());
        } catch (URISyntaxException ex) {
            Log.v("getvevents", "uri exception : " + ex.getLocalizedMessage());
        }
        cursor.moveToNext();
    }
    return events;
}

Когда я вызываю getVEvents, я получаю следующее исключение:

09-08 11:03:10.121: ERROR/AndroidRuntime(2696):     android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
09-08 11:03:10.121: ERROR/AndroidRuntime(2696):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
09-08 11:03:10.121: ERROR/AndroidRuntime(2696):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
09-08 11:03:10.121: ERROR/AndroidRuntime(2696):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
09-08 11:03:10.121: ERROR/AndroidRuntime(2696):     at com.unibean.SettingsDatabase.getVEvents(SettingsDatabase.java:177)

Строка 177 соответствует

e.getProperties().add(new Uid(cursor.getString(1)));

Как в методе запроса, так и в getVEvents я всегда проверяю, является ли курсор пустым, и использую moveToFirst () и moveToNext (), поэтому я не совсем уверен, почему происходит исключение и что именно " Индекс 1, запрошенный с размером 1 ", фактически означает.

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

Это означает именно то, что говорится.вы пытаетесь получить доступ к элементу 1 (второму, поскольку он начинается с нуля), когда размер равен единице.

У вас есть проблема с определением конца набора данных.Ваш cursor волшебным образом не станет null после того, как вы обработали последнюю строку.Вместо этого оно остается тем же значением, но его внутреннее состояние изменяется.

Вам необходимо обнаружить конец набора данных другим способом.

Вы можете использовать, например:

cursor.moveToFirst();
while (!cursor.isAfterLast()) {
    blah blah blah
    cursor.moveToNext();
}
1 голос
/ 08 сентября 2011

Ошибка означает, что вы запросили элемент с индексом 1, но список, в который был отправлен ваш запрос, имеет размер только 1 - это означает, что он содержит только один элемент, а максимальный индекс для него равен 0.

Казалось бы, ваш запрос возвращает курсор только с одной строкой.

0 голосов
/ 08 сентября 2011

Попробуйте этот код

 private Cursor query(String selection, String[] selectionArgs,
            String[] columns, String tableName) {
        /*
         * The SQLiteBuilder provides a map for all possible columns requested
         * to actual columns in the database, creating a simple column alias
         * mechanism by which the ContentProvider does not need to know the real
         * column names
         */
        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
        builder.setTables(tableName);
        Cursor cursor = builder.query(mDatabase, columns, selection,
                selectionArgs, null, null, null);
        return cursor;
    }

    public List<VEvent> getVEvents(int week, int year) {
        String selection = KEY_WEEK + "=? AND " + KEY_YEAR + "=?";
        String[] selectionArgs = new String[] { String.valueOf(week), String.valueOf(year) };
        Cursor cursor = query(selection, selectionArgs, ALL_CALENDAR_COLUMNS, CALENDAR_TABLE_NAME);
        List<VEvent> events = new ArrayList<VEvent>();
        while (cursor.moveToNext()) {
            VEvent e = new VEvent();
            try {
            e.getProperties().add(new Uid(cursor.getString(1)));
            e.getProperties().add(new DtStamp(cursor.getString(2)));
            e.getProperties().add(new Organizer(cursor.getString(3)));
            e.getProperties().add(new DtStart(cursor.getString(4)));
            e.getProperties().add(new DtEnd(cursor.getString(5)));
            e.getProperties().add(new Summary(cursor.getString(6)));
            e.getProperties().add(new Location(cursor.getString(7)));
            e.getProperties().add(new Description(cursor.getString(8)));
            events.add(e);
            } catch (ParseException ex) {
                Log.v("getvevents", "parse exception : " + ex.getLocalizedMessage());
            } catch (URISyntaxException ex) {
                Log.v("getvevents", "uri exception : " + ex.getLocalizedMessage());
            }

        }
        return events;
    }
...