それぞれのデータベース テーブルを担当する一連のクラスを含むプロジェクトがあります。
各テーブル管理クラスには、接続の取得、crud 操作の実行、接続の終了のパターンに従う CRUD メソッドが含まれています。
public class PersonManager {
SQLiteDatabase db;
DbAdapter dbAdapter; //This is a subclass of SQLiteOpenHelper
public void addPerson(Person person)
{
ContentValues contentValues = new ContentValues();
contentValues.put("email", person.email);
contentValues.put("first_name", person.firstName);
db = dbAdapter.getWritableDatabase();
db.insert("person", null, contentValues);
db.close();
}
...other crud/utility methods omitted...
}
onUpgrade() を使用してデータベースをアップグレードしているため、データベースがロックされている問題に遭遇しました。
正確なエラー メッセージは次のとおりです。
CREATE TABLE android_metadata failed
Failed to setLocale() when constructing, closing the database
android.database.sqlite.SQLiteException: database is locked
onUpgrade は次のいずれかを意味しているようです。
1 run db.execSQL() calls or
2 use helper classes that use onUpgrade()'s SQLiteDatabase rather than their own
テーブル管理クラスを使用して、db.execSQL() ステートメントよりも onUpgrade() でデータを移行するか、すべての CRUD メソッドを書き直して onUpgrade() の SQLiteDatabase を取得する方がはるかに簡単です。
データベースへのアクセスを正しく設定していますか? 上記のコードが正しいパターンに従っている場合、この問題を解決するにはどうすればよいですか?
ありがとう!