当项目中接手的需求需要在就前数据库数据表做出修改时,不得不面对数据库表结构的更新问题。一般的sqlite数据库更新修改数据库版本号时都会自动调用SqliteOptenHelper及其子类中的onUpgrade()方法,所以只需要在onUpgrade()方法中添加相应的表结构修改的sql语句即可。
然而,在实际项目中会存在多个版本的数据库升级的问题。比如当前最新版本的数据库版本为v3,而用户手中的应用版本却不尽相同,user1的数据库版本为v1,user2的数据库版本为v3,并且从v1到v2是有表结构更改操作的例如添加了表table1_2,v3在v2的基础上修改了表table1_2,此时如果让user1应用直接执行到v3的修改表table1_2操作是会出错的,因为数据库版本为v1的应用因为还没有将数据库版本升级为v2,故根本不存在table1_2,所以直接执行修改表语句必然会报错。
以下写法便很好的解决了以上的数据库跨版本升级问题:
public class DBHelper extends SQLiteOpenHelper {
private static String name="data.db";
private static int version=1;
public DBHelper(Context context) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user( _id integer primary key autoincrement, " +
"name text , desc text);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion){
case 1:
db.execSQL("v1版本时数据库升级操作"); //旧版本的数据库神级操作的case语句后都没有break语句,
//这样便可以确保每一次升级当前版本到最新版本的更新操作都可以被执行到了 case 2:
db.execSQL("v1——v2版本数据库升级操作");
case 3:
db.execSQL("v2——v3版本数据库升级操作");
//v3版本为当前最新数据库版本
break;
}
}
}