Android onUpgrade()因数据库被锁定而失败,我该怎么办?

时间:2012-03-02 00:22:50

标签: android database locked

我有一个项目,其中包含一组负责各自数据库表的类。

每个表管理类都包含遵循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。

我是否正确设置了数据库访问权限?如果上面的代码遵循正确的模式,我该怎么做才能解决这个问题?

谢谢!

2 个答案:

答案 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仅用于结构更改,而不是用于数据迁移/操作。