【问题标题】:Android SQLiteDatabase update schema without loosing dataAndroid SQLite 数据库更新架构而不丢失数据
【发布时间】:2015-06-02 14:02:56
【问题描述】:

我在我的应用程序中使用 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);
    }
}

我想在升级数据库架构时保留旧的用户数据。 但是,当我增加数据库版本并启动我的应用程序时,出现以下错误:

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

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

问候, tak3r07

【问题讨论】:

  • 你到底想做什么?添加一列?

标签: java android sql sqlite


【解决方案1】:

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

  1. 开始交易
  2. 创建新表
  3. 做一个insert .. select statement
  4. 删除旧表
  5. 提交事务

如果任何步骤失败,您仍然拥有数据,如果由于任何原因失败,您可以在任何步骤继续完成升级。您不希望像您正在做的那样将所有课程加载到您的应用程序的内存中,然后删除表格,因为如果您的应用程序无法将课程重新插入数据库,您将丢失所有数据。全部在 SQL 中完成。

【讨论】:

  • ALTER TABLE 完全符合我的要求!我忘了考虑“如果失败了怎么办”部分。好点子!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 2019-10-22
  • 2011-08-10
  • 2020-10-01
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多