15

私の Android アプリでは、SQLiteOpenHelper を使用して ContentProvider を実装しています。クエリ、追加、削除操作はすべて ContentProvider を介して行われます。

しかし、私の Android フォン (htc g13) の 1 つで、ディレクトリ /data/data/[パッケージ名]/databases に *.db-wal ファイルが見つかりました。また、ContentProvider を使用すると、ファイル サイズが非常に速く作成されます。ユーザー RAM スペースを占有しすぎました。

私の問題を解決するために SQLiteOpenHelper を閉じることをお勧めします (便利です) 。リンクの説明をここに入力してください。

しかし、SQLiteOpenHelper を直接 (ContentProvider を介して) 使用していないため、「close()」メソッドを追加する「場所」を見つけたいと考えています。ContentProvider の query() メソッドは Cursor を返す必要があり、SQLiteDatabse は開いた状態のままにしておく必要があります。

*.db-wal を維持して ContentProvider を通常どおり使用するために、今何をしているのか混乱しています。

4

2 に答える 2

7

Android フレームワーク エンジニアは、DB を閉じる必要があるというこのビューに従います。

このスレッドの Dianne Hackborn (Android Framework Engineer)によると:

コンテンツ プロバイダは、そのホスティング プロセスが作成されたときに作成され、プロセスが存在する限り存在し続けるため、データベースを閉じる必要はありません。プロセスが強制終了されます。

于 2013-08-08T18:36:13.157 に答える
6

カバーするケースがいくつかあります。

1) アプリケーションが終了したら (たとえば、onDestroy() に入ると)、必ずすべてのカーソル、SQLiteDatabase のデータベース インスタンス、および SQLiteOpenHelpers を閉じます (モデル if (connection.isOpen()) object.close() を使用)。

2) アプリケーションが onPause() -> onResume() になった場合 - このステージを適切に使用して、接続を一時停止/再開したり、接続を閉じたり開いたりします。

データベースでの作業が終了したら、すぐにデータベースを閉じることをお勧めします。データベースはキャッシュされているため、必要なときに getWritableDatabase()/getReadableDatabase() を使用してインスタンスを閉じて再取得しても問題ありません。

公式ドキュメントから: 「正常に開くと、データベースはキャッシュされるため、データベースへの書き込みが必要になるたびにこのメソッドを呼び出すことができます。(データベースが不要になったら、必ず close() を呼び出してください。)」

また、SQLiteOpenHelper が SQLiteDatabase のすべての開いているインスタンスをキャッシュして追跡する場合、基本的には、データベース接続を開いたままにしない場合、SQLiteOpenHelper で close を呼び出す必要がないことを意味します。

カーソルとデータベースの使用を停止したら、すぐにすべてのカーソルとデータベースを閉じることをお勧めします。クエリ操作には常に try/catch/ を適用し、「finally ブロック」を使用してオブジェクトの close メソッドを呼び出すようにしてください。

于 2011-12-16T09:18:31.787 に答える