例外:
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)的方式与此不同吗?
编辑:我和谷歌团队@and开发者小时谈过,他们说onUpgrade3从来没有打算做任何像结构改变(改变)的事情。所以,是的,似乎现在必须在许多情况下使用一些黑客。
答案 0 :(得分:0)
我通过扩展Application
类来使用以下模型。我维护一个我的db帮助程序的静态实例,所有其他应用程序组件都使用...
public class MyApp extends Application {
protected static MyAppHelper appHelper = null;
protected static MyDbHelper dbHelper = null;
@Override
protected void onCreate() {
super.onCreate();
...
appHelper = new MyAppHelper(this);
dbHelper = MyAppHelper.createDbHelper();
dbHelper.getReadableDatabase(); // Trigger creation or upgrading of the database
...
}
}
从那时起,任何需要使用db helper的类都会执行以下操作......
if (MyApp.dbHelper == null)
MyApp.appHelper.createDbHelper(...);
// Code here to use MyApp.dbHelper