1

HTC Desire(androidバージョン2.3.3)でアプリを実行する次の関数を呼び出すと、メモリ使用量が増加することに気付きました。

private static final String TABLE_MODULES = "tbl_module1";
private static final String MOD1_INCLUDE = "mod1_include";

private void setItemInclude (int idx, boolean include)
{
    String incString = "";
    if (include)
        incString = "true";
    else
        incString = "false";

    ContentValues args = new ContentValues();
    args.put(MOD1_INCLUDE, incString);
    database.update(TABLE_MODULES,args,"_id="+idx,null);
}

ここで、データベースはSQLiteDatabaseタイプであり、dbHelper.getWritableDatabase()の呼び出しから取得され、dbHelperはSQLiteOpenHelperから派生し、アプリケーションコンテキストでインスタンス化されます。

必要な更新を取得しましたが、アプリケーションのデータ使用量を確認すると、呼び出しごとに約60KB増加しているように見え、dbHelper.close()が呼び出されない限り解放されません。この関数を複数回呼び出すと、SQLiteDiskIOExceptionが発生します。

私は試しdatabase.rawQuery()ましたが、これも正しく更新されますが、同様にメモリに残ります。

String updateQuery = "UPDATE " + TABLE_MODULES + " SET MOD1_INCLUDE = " + "'" + incString + "'" + " WHERE _id ='" + idx + "'";

Cursor cursor = database.rawQuery(updateQuery, null);
cursor.moveToFirst();
cursor.close();

Asus(android 4.0.3)とOrange San Francisco(android 2.1.update1)で同じコードを実行しても、この問題は発生しません。

getWritableDatabaseはアクティビティから呼び出されonCreate()、結果のデータベースはで閉じられますonDestroy()。活動中はデータベースを開いたままでも大丈夫だと思いました。原因は何かについて何か考えはありますか?

4

2 に答える 2

0

問題の原因を突き止めました。

HTC では、呼び出されるたびにdatabase.update()、一時ファイルがアプリケーションのデータベースディレクトリで更新されます。このファイルの拡張子は.sqlite-walです。このファイルは呼び出しごとに (60KB ずつ) 大きくなり、データベースを閉じたときにのみ削除されます。

ASUS は一時ファイルも作成しますが、拡張子は.sqlite-journalです。このファイルもupdate()呼び出しごとに更新されますが、トランザクションが完了すると、ファイルのサイズはゼロになります。したがって、メモリの問題は発生しません。

Journal と Wal の違いはよくわかりませんが、どちらもトランザクションの失敗後にデータベースをロールバックすることに関係していると思います。次のコードでメモリの問題を解決しました。これにより、journal/wal 機能がオフになります。

Cursor cursor = database.rawQuery("PRAGMA journal_mode=OFF", null);
cursor.moveToFirst();
cursor.close();

データベースを開いた後にこれを呼び出すと、これらの一時ファイルが作成されないように見えます。

ただし、これが良いアイデアかどうかはわかりません。この問題を他の人が報告していないことに驚いたのですが、複数のトランザクションに対応できるようにデータベースを開いたままにしておくことは悪い習慣と見なされるのでしょうか? 私は SQL を初めて使用し、データベースの経験はかなり限られています。

于 2012-12-24T00:00:38.760 に答える
0

ドキュメントは非常に明確です。

WAL ジャーナリング モードでは、ロールバック ジャーナルの代わりに先行書き込みログを使用してトランザクションを実装します。

あなたの場合、自動チェックポイントが構成されていないか、機能していないようです。データが失われる可能性があるため、おそらくジャーナリングをオフにしたくないでしょう。

于 2013-08-15T19:19:57.660 に答える