アプリ全体で単一の 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 番目の方法は、このセットアップに最適なオプションですか?
ありがとう