8

私のデータベース アダプタ クラスには、次のようなメソッドが多数あります。

public long getContactId(final String phoneNumber) throws SQLException {
    final Cursor cur = mDb.rawQuery(
            "select contact_id from contactphones where number=? limit 1;",
            new String[] { phoneNumber });
    return cur.moveToFirst() ? cur.getLong(0) : -1;
}

そのような方法の簡潔さに感謝します。しかし、私は Cursor.close() を呼び出していません。それが問題かどうかはわかりません。Cursor は閉じられ、そのリソースは Cursor.finalize() で解放されますか? それ以外の場合は、次のことを行う必要があります。

public long getContactId(final String phoneNumber) throws SQLException {
    final Cursor cur = mDb.rawQuery(
            "select contact_id from contactphones where number=? limit 1;",
            new String[] { phoneNumber });
    final boolean retVal = cur.moveToFirst() ? cur.getLong(0) : -1;
    cur.close();
    return retVal;
}
4

3 に答える 3

2

はい、カーソルオブジェクトの使用が終了したら、カーソルを閉じることをお勧めします。これにより、カーソルは、閉じたときに実行したいハウスキーピング作業を実行できます。

于 2012-10-22T10:06:04.127 に答える
1

カーソルはクラスではなくインターフェースです。Cursor オブジェクトが SQLite クエリからのものである場合、それは SQLiteCursor です。その定義(\Android\android-sdk\source\android\database\sqlite\SQLiteCursor.java)close()は、関数で呼び出されfinalize()ます。Cursor インターフェイスではこの動作が指定されていないため、これは他のカーソル タイプでは異なる場合があります。

于 2012-10-22T09:14:30.250 に答える
0

データベースを閉じないでください。必要はありません(とにかく、データはできるだけ早い機会に永続ストレージに安全に書き込まれます)。アプリケーションの起動時に一度開き、アプリケーションの存続期間を通じて同じ接続を再利用します

このリンクを参照してください

于 2012-10-22T10:07:05.183 に答える