Android Sqlite 数据库升级时注意事项,android 移动开发基础题库
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
如果第一次的数据库版本为 1,现在升级之后版本为 2,即当前 app 版本比上次的 app 版本中的数据库的版本号高 1 级,也有可能是 3 升 4, 4 升 5 这样的,先看下这时的处理有几种情况要考虑:
1. 摒弃之前的表并重新创建该表
这种情况一般是数据库中的数据可能是一些无关紧要的临时数据,处理比较简单粗暴,直接删除重建,且表的结构跟之前完全一样。不过应该很少有采用这种方式的吧。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1://这里的数值是上次的
版本,也就是针对上次的版本,本次的版本要做哪些改变
db.execSQL("DROP TABLE IF EXISTS " + TableEvent.TABLE_NAME);
db.execSQL(TableEvent.CREATE_SQL);
default:
break;
}
}
2. 在之前基础上创建新的表
这种情况也比较简单,主要是新版比之前的版本创建新的表,而且这个表跟之前的表没有什么关系。这时同时也要在 onCreate 中加上执行创建的 sql(针对新用户)。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1://这里的数值是上次的版本,也就是针对上次的版本,本次的版本要做哪些改变
//这种情况需要同时在 onCreate 中加上执行新表的创建 sql(针对新用户)
db.execSQL(xxxxx);
default:
break;
}
}
3. 在老表基础上新增字段
这种情况需要修改老的表新增字段
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1://这里的数值是上次的版本,也就是针对上次的版本,本次的版本要做哪些改变
//这种情况需要同时在 onCreate 中加上执行新增字段的创建表 sql(针对新用户)
db.execSQL("ALTER TABLE TableEvent.CREATE_SQL ADD COLUMN TableEvent.xxx VARCHAR(255)");
default:
break;
}
}
4. 数据库升级时保留老的数据并同步到新的表当中
这种情况是新表保留老表的字段结构情况
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1://这里的数值是上次的版本,也就是针对上次的版本,本次的版本要做哪些改变
//老的表重命名
String CREATE_TEMP_BOOK = "alter table book rename to _temp_book";
//创建新的表,表名跟原来一样,并保留原来的字段
String CREATE_BOOK = "create table book(bookId integer primarykey, bookName text);";
//将重命名后的老表中的数据导入新的表中
String INSERT_DATA = "insert into book select *,'' from _temp_book";
//删除老表
String DROP_BOOK = "drop table _temp_book";
db.execSQL(CREATE_TEMP_BOOK);
//这句要同时放到 onCreate 中,针对新用户
db.execSQL(CREATE_BOOK);
db.execSQL(INSERT_DATA);
db.execSQL(DROP_BOOK);
default:
break;
}
}
5. 新表跟以前的表字段结构完全不一样
这种情况是新表跟以前字段结构完全不一样或者说有大部分的差异,跟上面第 4 种处理差不多,但是需要手动查询老表的某些字段的数据然后插入的新表的对应字段,最后删除老表即可。
评论