У меня есть проект с набором классов, которые отвечают за соответствующие им таблицы базы данных.
Каждый класс управления таблицами содержит методы 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
Было бы намного проще использовать классы управления моей таблицей для переноса данных в onUpgrade (), чем в db.execSQL (), или переписать все мои методы CRUD, чтобы использовать SQLiteDatabase onUpgrade ().
Правильно ли я настраиваю свой доступ к базе данных? Если приведенный выше код следует правильному шаблону, что я должен сделать, чтобы решить эту проблему?
Спасибо!