我正在制作一个Android应用程序,我正在使用SQLite
数据库。我已经发布了它的一个版本,现在已经发布了第二个和第三个版本,假设我需要更改数据库表,如添加/删除字段。
那么如何在Android中处理此升级。在这里,我不想删除整个表格,这里应该使用Alter
来更新表格。
假设用户已经安装了我的应用程序的第一个版本,那么几天之后我发布了下一个版本1.1
并对数据库表进行了更改 - 添加了一个字段,此处用户没有升级它,同时我再次发布了{{ 1}}再添加一个字段
所以这里我将如何处理这种情况当这个用户将我的应用程序从版本1.2
升级到版本1
时,错过版本1.2
并且我添加的属性也错过了会造成问题。
解决这个问题的任何解决方案??
答案 0 :(得分:3)
假设您正在使用SQLiteOpenHelper
,只需为数据库架构更改的任何待发布版本增加数据库版本号。如果有一个较旧的数据库文件,将调用onUpgrade()
,以便您可以从任何旧版本迁移数据库。
例如,如果1.0数据库版本为1,则1.1为2,1.2为3,用户将版本1.0更新为1.2。调用onUpgrade()
时,oldVersion
设置为1,newVersion
设置为3.从这些版本号中,您的代码可以找出需要完成的操作,例如:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1:
updateFrom1To2(db);
case 2: // fall-through
updateFrom2To3(db);
break;
default:
Assert.fail("You forgot to write code for oldVersion " + oldVersion);
}
}
答案 1 :(得分:0)
您可以在sqldb中的onUpgrade
中执行任何操作
。您可以使用ALTER
向表中添加新列。
最糟糕的情况是,如果您的架构完全不同,您必须创建新表,使用旧表中的数据填充它,然后删除旧表。
无论如何,onUpgrade
旨在实现平滑升级而不会丢失任何数据。您可以正确地实施它。
您应该在onUpgrade方法中放置所有更改,您可以使用此代码:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "ALTER TABLE " + TABLE_SECRET + " ADD COLUMN " +
"name_of_column_to_be_added" + " INTEGER";
db.execSQL(sql);
}
了解更多this
修改强>
这是一个很好的想法,我找到了一个解决方案(未经测试),你需要 检查更新,示例 - 检查您在1.1中完成的ALTER 版本1.2通过读取db行或某些东西,如果它 不存在,你想用1.2改变来改变它。
答案 2 :(得分:0)
我通常遵循onUpgrade方法的不同类型的实现来支持数据库中的向后兼容性。
注意:这里我只展示在最新数据库版本中添加更多列的实现。
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 1. Copy the database file to temproary file.
// 2. Drop all the old tables from db
// db.execSQL("DROP TABLE IF EXISTS " + <TABLE NAME> );
// 3. Create tables using new Schema
// this.onCreate(db);
// 4. Copy the data from temproary file to new db
// 5. Remove the temprorary file
}
使用这种实现比使用ALTER命令更方便。