我在我的应用程序中使用 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命令可用于对现有表执行一些架构更改,而不会丢失数据。如果您确实发现需要从头开始创建表,则应遵循以下模式:
- 开始交易
- 创建新表
- 执行insert .. select statement
- 删除旧表
- 提交交易
如果任何步骤失败,您仍然拥有数据,并且如果由于任何原因失败,您可以在任何步骤中继续完成升级。您不想像您正在做的那样将所有类(class)加载到应用程序的内存中,然后删除表,因为如果您的应用程序无法将类(class)插入回数据库,您将丢失所有数据。这一切都用 SQL 完成。
关于java - Android SQLite 数据库更新架构而不丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30598322/