バックグラウンド
次のようにカーソルを使用しています。
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...
}
}
これにより、閉じたカーソルを再利用しようとすると、ループの 2 回目のラウンドで StaleDataException が発生します。cursor.close() を削除すると問題なく動作しますが、「事前に閉じることなくカーソルが終了しました」という警告が表示されます。
リサーチ
この回答のアドバイス: https://stackoverflow.com/a/18107638/1977132は、おそらくカーソルを null に設定して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();
しかし、これは「カーソルが初期化されていない可能性があります」というエラーでコンパイルされません。
質問
私の質問は、ループ内でカーソルを正しく使用して閉じる方法です。