在Android中,这是设置SQLiteDatabase助手的正确方法吗?

时间:2012-03-02 18:08:28

标签: android database sqlite

例外:

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从来没有打算做任何像结构改变(改变)的事情。所以,是的,似乎现在必须在许多情况下使用一些黑客。

1 个答案:

答案 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