Исключение:
CREATE TABLE android_metadata failed
Failed to setLocale() when constructing, closing the database
android.database.sqlite.SQLiteException: database is locked
Мое приложение работает нормально и не имеет проблем с БД, кроме случаев, когда вызывается onUpgrade ().
Когда автоматически вызывается onUpgrade, он пытается использовать класс CarManager, указанный ниже, для обработки данных, необходимых для обновления.Это терпит неудачу, потому что БД заблокирована.
Поскольку это кажется нормальным делом, кажется, что я не должен правильно структурировать следующий код (следуют два класса, помощник и менеджер таблиц).):
public class DbHelper extends SQLiteOpenHelper {
private Context context;
//Required constructor
public DbAdapter(Context context)
{
super(context, "my_db_name", null, NEWER_DB_VERSION);
this.context = context;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
overrideDB = db;
CarManager.migrateDataForOnUpgrade(context);
}
}
public class CarManager {
DbHelper dbHelper;
public CarManager(Context context)
{
dbHelper = new DbHelper(context);
}
public void addCar(String make, String model)
{
ContentValues contentValues = new ContentValues();
contentValues.put("make", make);
contentValues.put("model", model);
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.insert("car", null, contentValues);
db.close();
}
public static void migrateDataForOnUpgrade()
{
//Code here that migrates data when onUpgrade() is called
//Db lock happens here
}
}
Есть идеи?Люди настраивают менеджер таблиц (например, dao) иначе, чем этот?
edit: я разговаривал с google team @ android developer hours, и они говорили, что onUpgrade3 никогда не предназначался для того, чтобы делать что-то вроде структурных изменений (изменяет),Так что да, похоже, что есть некоторые хаки, которые нужно использовать во многих случаях прямо сейчас.