2

次のコードで使用しているカーソルがあります。しかし、カーソルが使用されて不要になった後は、カーソルを閉じたいと思います。問題は、カーソルが return ステートメントで使用されていることですが、return ステートメントの後でカーソルを閉じることができません。これは、到達できないコードだからです。returnステートメントで使用されているため、その行より上で閉じることはできません。カーソルを閉じるにはどうすればよいですか? これは古い managedQuery とは異なります。閉じる必要があると思います。

   public String getPath(Uri uri) {
    String[] projection = { MediaStore.Audio.Media.DATA };
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
      // cursor.close() <--- not possible because it is unreachable code after return
}
4

5 に答える 5

2

それをStringオブジェクトに割り当ててから、カーソルを閉じて返すことができます。

cursor.moveToFirst();
String result = cursor.getString(column_index);
cursor.close();
return result;
于 2012-12-12T10:38:44.897 に答える
1

最終的にブロックを使用することはあなたのために働きますか?私はあなたの特定の問題を経験していませんが、それ以外の場合はreturnステートメントによってバイパスされるfinallyブロックにクリーンアップを配置できますか?

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

ただのアイデア!そうでなければ私を撃たないでください!

于 2012-12-12T10:39:23.477 に答える
1

試してみてください - 最後に救助に...

public String getPath(Uri uri) {

  Cursor cursor = null;

  try {
    String[] projection = { MediaStore.Audio.Media.DATA };
    cursor = getContentResolver().query(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
    cursor.moveToFirst();


    return   cursor.getString(column_index);
    }
    finally {
     if (cursor != null)
        cursor.close(); // close the cursor
    }


 }

ノート

以下の別の回答に注意してください。アクティビティ内にいる場合はstartManaginCursor()、インスタンスを呼び出して渡すことができるcursorため、Android はその有効期間を管理します。Android アプリケーション コンテキストにアクセスできない場合 (例: コードがユーティリティ クラスにある場合)、上記の方法を使用します。(そして、いくつかのエラー処理を少し振りかけます;))

于 2012-12-12T10:42:09.643 に答える
0

同じアクティビティのたびに新しいインスタンスを作成している場合(ただし、プログラミングが適切かどうかはわかりません)。行/列のトラバース/反復が終了したらすぐにカーソルを閉じることができます。使用することを忘れないでください:

   startManagingCursor(cursor);
于 2012-12-12T10:39:18.530 に答える
0

if (this.daoDatabase != null) {

        final Cursor genericCursor = this.daoDatabase.query(this.tableName, null, null, null, null, null, orderByCriteria);

        if (genericCursor != null) {
            if (genericCursor.moveToFirst()) {
                do {
                   // do stuff...
                } while (genericCursor.moveToNext());
            }
            genericCursor.close();
        }
    }
于 2012-12-12T10:41:27.733 に答える