我有一个带有一组类的项目,这些类负责各自的数据库表。
每个表管理类都包含遵循get connection、run crud operation、close connection模式的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。
我是否正确设置了数据库访问?如果上面的代码遵循正确的模式,我应该如何解决这个问题?
谢谢!
最佳答案
这是你的问题:
db = dbAdapter.getWritableDatabase();
当您在onupgrade()中时,必须使用onupgrade()提供的sqlitedatabase句柄。因此,您的解决方案是重写addPerson函数以获取另一个参数——sqlitedatabase句柄:
public void addPerson(Person person, SQLiteDatabase db) {...}
如果需要从项目中的其他地方调用addPerson(),则保留当前的addPerson(person person)函数,让它这样做
db=dbadapter.getWritableDatabase()
调用,并将db传递给addPerson()的双参数版本。
关于android - Android onUpgrade()失败,因为数据库已锁定,我该怎么做?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9526316/