我有一个项目,其中包含一组负责各自数据库表的类。
每个表管理类都包含遵循get connection模式,运行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。
我是否正确设置了数据库访问权限?如果上面的代码遵循正确的模式,我该怎么做才能解决这个问题?
谢谢!
答案 0 :(得分:2)
这是你的问题:
db = dbAdapter.getWritableDatabase();
当你在onUpgrade()中时,你必须使用onUpgrade()为你提供的SQLiteDatabase句柄。因此,您的解决方案是重写您的addPerson函数以再接受一个参数 - 一个SQLiteDatabase句柄:
public void addPerson(Person person, SQLiteDatabase db) {...}
如果你需要从项目的其他地方调用addPerson(),那么保留你当前的addPerson(Person person)函数,让它做到这一点 db = dbAdapter.getWritableDatabase() 调用,并将db传递给addPerson()的双参数版本。
答案 1 :(得分:1)
我没有得到任何答案,所以我问了一个开发环境。
根据Android开发人员环聊团队的说法,onUpgrade仅用于结构更改,而不是用于数据迁移/操作。