1

バックグラウンド

次のようにカーソルを使用しています。

        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();

しかし、これは「カーソルが初期化されていない可能性があります」というエラーでコンパイルされません。

質問

私の質問は、ループ内でカーソルを正しく使用して閉じる方法です。

4

2 に答える 2

1

これを試して

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();
于 2015-08-25T10:42:42.713 に答える
1

これは、カーソルを閉じる適切な方法です。

    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();
        }
    }
于 2015-08-25T11:10:01.997 に答える