1

アプリ全体で単一の sqlite データベースを使用しています。そのため、便宜上、データベースへの接続をシングルトンでラップしたいと考えています。最初は、そのために SQLiteDatabase への参照を保持できると考えました。

MySQLiteOpenHelper helper = new MySQLiteOpenHelper(appContext); // local
myGlobalSQLiteDatabase = helper.getWritableDatabase(); // global

...

void someFunction() {
    try {
        myGlobalSQLiteDatabase.insertOrThrow(...);
    } catch (Exception ex) {
    }
}

ただし、これにより次のようなエラーが発生します。

(1802) os_unix.c:30011: (2) stat(/data/data/com.me.test/databases/test.db) - 
(1802) statement aborts at 16: [INSERT INTO mytable(f1,f2) VALUES (?,?)]
android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1802)
    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775)
    ...

(これはすべてメインスレッドで実行され、単一のテストです)。

私の2番目の試みは、代わりにヘルパーのみへのグローバル参照を保持することでした:

myGlobalSQLiteOpenHelper helper = new MySQLiteOpenHelper(appContext); // global

...

void someFunction() {
    SQLiteDatabase db = myGlobalSQLiteOpenHelper.getWritableDatabase();
    try {
        db.insertOrThrow(...);
    } catch (Exception ex) {
    } finally {
        db.close();
    }
}

そしてそれはうまくいきます。someFunction() を呼び出すたびに getWritableDatabase() と close() を呼び出す必要があります。

getWritableDatabase() と close() にどれだけのオーバーヘッドがあるかわかりません。最初は、ユーザー入力に応じて someFunction() を繰り返し呼び出すため、可能な限り最速の実装を望んでいました。2 番目の方法は、このセットアップに最適なオプションですか?

ありがとう

4

1 に答える 1