5

誰かが Android Cursors の簡単な概要を教えてくれるかどうか疑問に思っていました。いくつかの具体的な質問:

1 - データベース クエリの後にカーソルを返すメソッドがあります。

    public static Cursor getVehicles()
{
    SQLiteDatabase db = vehicleData.getReadableDatabase();
    Cursor cursor = db.query(TABLE_NAME, GET_VEHICLES_FROM_CLAUSE, null, null, null, null, ORDER_BY);

    return cursor;
}

ハウスキーピングを行うために、return ステートメントの直前で db.close() を試しました。ただし、これにより、返されたカーソルに行が含まれていませんでした。どうしてこれなの?

2 - カーソルを閉じることとデータベースを閉じることの違いは何ですか?

3 - Cursor がローカル変数である場合、Cursor で close を呼び出す必要がありますか? または、クリーンアップをガベージ コレクターに任せることができますか?

4 - 私のデータベースは小さく、私のアプリケーションでしか使用されません。開いたままにしておくことはできますか?

4

1 に答える 1

9

1) カーソルは、クエリによって返されたデータへの単なるポインターであり、クエリからのすべてのデータが含まれているわけではありません。これは、パフォーマンス/効率を向上させるためです (大きな結果セットは一度に読み込まれません -> 使用されるメモリが少なくなります)。したがって、データベースを閉じると、カーソルはデータを取得できません->空になります。

2) カーソルを閉じると、関連付けられているすべてのリソースが解放されます -> このカーソルに関連付けられているデータにはアクセスできません (解放されているため) が、このカーソルまたは他のカーソルを使用して新しいクエリを作成できます。データベースを閉じると、(再度開くまで) クエリを実行できなくなります。

3) 常にカーソルを閉じます。そうしないと、問題が発生します。カーソルが閉じられておらず、新しいクエリがブロックされている場合、GC は文句を言います。

4) アプリの終了時に閉じる場合は、はい。

于 2011-03-27T15:49:20.417 に答える