0

データベースにクエリを実行してカーソルを返すために使用するデータベース ハンドラー クラスがあります。

これは方法です:

public Cursor getData() {

    String[] columns = new String[] { KEY_ROWID, KEY_NAME, KEY_TEL,
            KEY_EMAIL, KEY_COMMENTS };
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
            null, KEY_NAME + " ASC", null);

    if (c != null) {

        c.moveToFirst();
    }

    return c;

ご覧のとおり、ポインターをカーソル内の最初の要素に設定して、返す準備ができています。現在、「非アクティブ化またはクローズされていないカーソルをファイナライズ中」という例外を受け取っています。これは、.close() を明示的に呼び出さない場所で使用している唯一のカーソルです。これの私の理由は、戻り値の型が必要であり、nullpointer エラーが設定されるため、返す前にカーソルを閉じることができないためです。

返されたカーソルの処理方法は次のとおりです。

    DBHandler search = new DBHandler(this, null, null);

    search.open();
    Cursor cursor = search.getData();
    search.close();
    startManagingCursor(cursor);

データベースハンドラクラスでカーソルを閉じるのを助けるために、誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

3

次に、呼び出してgetCursorいるメソッドが何であれ、それを閉じる責任があります。Java 7 の try-with-resources を次のように使用します。

try(Cursor c = getData()) {
    // ...
} // closes

または、必要なだけ高く渡します。コール スタックのどこかに、カーソルのリソースを管理するメソッドを配置する必要があります。これは、可能な限りガベージ コレクターに任せる言語で作業することのトレードオフの一部であり、独自のリソースを管理する必要がある場合に、ぎこちない構文とセマンティクスを残します。

于 2013-03-19T03:30:03.510 に答える
0

このように使用する必要があります。

public Cursor getData() {
String[] columns = new String[] { KEY_ROWID, KEY_NAME, KEY_TEL, KEY_EMAIL, KEY_COMMENTS };
     return ourDatabase.query(DATABASE_TABLE, columns, null, null, null,null, KEY_NAME + " ASC", null);
}

ここで、反復するcursor必要があり、作業が完了したら を閉じますcursor

DBHandler search = new DBHandler(this, null, null);

search.open();
Cursor record = search.getData();    
//startManagingCursor(record);  
if(record.getCount()!=0){
    if(record.moveToFirst()){
        do{

        //your code here.
        }while(record.moveToNext());
    }
}   
record.close();
search.close();

これを試して。

于 2013-03-19T04:34:07.943 に答える