Как закрыть курсор, используемый в цикле 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();
}
}