java - Android SQLite 数据库更新架构而不丢失数据

标签 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);
    }
}

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

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

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

问候, 德3r07

最佳答案

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

  1. 开始交易
  2. 创建新表
  3. 执行insert .. select statement
  4. 删除旧表
  5. 提交交易

如果任何步骤失败,您仍然拥有数据,并且如果由于任何原因失败,您可以在任何步骤中继续完成升级。您不想像您正在做的那样将所有类(class)加载到应用程序的内存中,然后删除表,因为如果您的应用程序无法将类(class)插入回数据库,您将丢失所有数据。这一切都用 SQL 完成。

关于java - Android SQLite 数据库更新架构而不丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30598322/

相关文章:

c# - 如何在两个条件的单个查询中获取多个 SUM()

JavaFX 未包含在 OpenJDK8 中?

android - 在更改 GridView 以链接 xml 布局时显示 log cat 错误

java - 在浏览器启动和关闭时调用自定义 URI 方案

android - 未获取服务中共享首选项的更新值

Android:AnimateDrawable 无法解析为类型?

java - 使用 ExtlibX 访问 MSSQL 表单 Xpages 时出错 - 不支持驱动程序或 JVM

sql - 我怎样才能让我的 Postgresql SELECT 从具有相同名称的列中返回数据?

Java 媒体框架 x64 位

java - LibGDX 的 mesh.getVerticies 输出什么?