Android SQLiteDatabase更新架构而不会丢失数据

时间:2015-06-02 14:02:57

标签: java android sql sqlite

我在我的应用中使用SQLiteDatabase。我的SQLiteOpenHelper.onUpgrade(..)方法如下所示:

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    //Save current data
    ArrayList<Course> tempCourses = getAllCourses();

    //Drop tables
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_COURSES);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_ASSIGNMENTS);

    //create new tables
    onCreate(db);

    //Add temp data back to the database
    for (Course course : tempCourses) {
        addCourse(course);
    }
}

我希望在升级数据库架构时保留旧的userdata。 但是,当我增加数据库版本并启动我的应用程序时,我收到以下错误:

...
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tak3r07.unihelper/com.tak3r07.CourseStatistics.MainActivity}: java.lang.IllegalStateException: getDatabase called recursively
...

这是因为getAllCourses()将再次打开数据库以获取调用onUpgrade方法的数据(明显的循环)。 但是我应该如何存储我的用户数据?

此致 Tak3r07

1 个答案:

答案 0 :(得分:2)

ALTER TABLE命令可用于对现有表执行某些架构更改,而不会丢失数据。如果您确实发现需要从头开始创建表,则应遵循以下模式:

  1. 开始交易
  2. 创建新表
  3. 执行insert .. select statement
  4. 删除旧表
  5. 提交交易
  6. 如果任何步骤失败,您仍然拥有数据,并且如果因任何原因失败,您可以在任何步骤选择完成升级。您想要将所有课程加载到应用程序的内存中,就像您正在执行的那样然后删除表格,因为如果您的应用程序无法将课程重新插入数据库,您将失去所有课程数据。在SQL中全部完成。