Как закрыть курсор, используемый в цикле for

Фон

У меня есть курсор, используемый следующим образом:

        for (int n=0; n<num_songs; n++) {
            boolean isChecked = checked_positions.get(n);
            if (isChecked) {
                Cursor cursor = (Cursor) getListView().getItemAtPosition(n);
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                cursor.close();
                //save artist and title strings to file...
            }
        }

Это создает исключение StaleDataException во второй раз цикла, когда он пытается повторно использовать закрытый курсор. Если я удаляю cursor.close(), он работает нормально, но я получаю предупреждение "Курсор завершен без предварительного закрытия".

Исследование

Совет в этом ответе: /questions/46985575/popyitka-poluchit-dostup-k-kursoru-posle-ego-zakryitiya/46985590#46985590 - установить курсор в ноль cursor.close(); cursor = null; предположительно, поэтому можно создать новый курсор, но это не имеет значения, во второй раз за цикл он все еще дает исключение StaleDataException.

Я уже попробовал...

Я попытался переместить его за пределы цикла следующим образом:

        Cursor cursor;
        for (int n=0; n<num_songs; n++) {
            boolean isChecked = checked_positions.get(n);
            if (isChecked) {
                cursor = (Cursor) getListView().getItemAtPosition(n);
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                //save artist and title strings to file...
            }
        }
        cursor.close();

но это не скомпилируется с ошибкой "курсор не мог быть инициализирован".

Вопрос

Мой вопрос заключается в том, как правильно использовать и закрыть курсор в цикле.

2 ответа

Решение

Попробуй это

Cursor cursor = null;
for (int n=0; n<num_songs; n++) {
    boolean isChecked = checked_positions.get(n);
    if (isChecked) {
        cursor = (Cursor) getListView().getItemAtPosition(n);
        String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
        String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
        //save artist and title strings to file...
    }
}
if(cursor != null)
    cursor.close();

Это правильный способ закрыть курсор:

    Cursor cursor = null;
    try{
        for (int n=0; n<num_songs; n++) {
            boolean isChecked = checked_positions.get(n);
            if (isChecked) {
                cursor = (Cursor) getListView().getItemAtPosition(n);
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                //save artist and title strings to file...
            }
        }
    } finally {
        if(cursor != null){
            cursor.close();
        }
    }
Другие вопросы по тегам