我有一个项目,其中包含一组负责各自数据库表的类。
每个表管理类都包含 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 方法以采用 onUpgrade() 的 SQLiteDatabase。
我是否正确设置了我的数据库访问权限?如果上面的代码遵循正确的模式,我应该怎么做才能解决这个问题?
谢谢!