最近开发中遇到了需要改变项目数据库的表中字段,添加新表等需求,而又需要保证原有数据不变,这就涉及到数据库升级!现在就来总结记录一下:包含原表中增加字段,删除字段,修改字段,添加新表等四种升级操作!
SQLiteOpenHelper类中有两个方法:onCreate 和 onUpgrade,只有在第一次使用应用的时候会执行一次onCreate,之后除非把应用卸载重新安装才会重新执行onCreate,但是卸载的同时原有数据已被清除!因此,想要在改变数据库的同时保证原有数据不变,需要在onUpgrade中做逻辑处理。
具体实例:
public class Person {
public String name;
public int age;
@Override
public String toString() {
return "name: "+name+" ,age: "+age;
}
}
首次应用,创建数据库,并创建一张表,这时数据库版本是1
public DBHelper(Context context) {
super(context, "person.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user (_id integer primary key autoincrement,age Integer(20),name varchar(20))");
}
一、添加city字段
Person中添加city属性,类型String
public DBHelper(Context context) {
super(context, "person.db", null, 2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion){
case 2://升级添加多个字段时只能一个一个添加
String sql = "ALTER TABLE user ADD COLUMN city VARCHAR";
db.execSQL(sql);
break;
}
二、删除表中某个字段
删除Person中的city字段
public DBHelper(Context context) {
super(context, "person.db", null, 3);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion){
case 3:
/**删除表中某个字段*/
//1.将表名改为临时表
String sqlDrop1 = "ALTER TABLE \"user\" RENAME TO \"_User_temp_2016\";";
db.execSQL(sqlDrop1);
//2.创建新表(新表中没有city这个字段)
String sqlDrop2 = "CREATE TABLE \"user\" (_id integer primary key autoincrement,sex varchar(20),name varchar(20))";
db.execSQL(sqlDrop2);
//3.将临时表中数据导入新表
String sqlDrop3 = "INSERT INTO \"user\" (\"_id\",\"sex\", \"name\") SELECT \"_id\", \"age\" ,\"name\" FROM \"_User_temp_2016\";";
db.execSQL(sqlDrop3);
//4.更新sqlite_sequence
String sqlDrop4 = "UPDATE \"sqlite_sequence\" SET seq = 3 WHERE name = 'user';";
db.execSQL(sqlDrop4);
//5.删除临时表
String sqlDrop5 = "DROP TABLE _User_temp_2016;";
db.execSQL(sqlDrop5);
//直接用下面的方法来删除字段是无效的
// String sqlDrop = "ALTER TABLE user DROP COLUMN city";
// db.execSQL(sqlDrop);
break;
}
}
三、修改字段
将Person中age字段修改为String类型的sex
public DBHelper(Context context) {
super(context, "person.db", null, 4);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion){
case 4:
/**修改表中原有字段*/
//1.将表名改为临时表
String sql1 = "ALTER TABLE \"user\" RENAME TO \"_User_old_20160909\";";
db.execSQL(sql1);
//2.创建新表
String sql2 = "CREATE TABLE \"user\" (_id integer primary key autoincrement,sex varchar(20),name varchar(20),city varchar(20))";
db.execSQL(sql2);
//3.将临时表中数据导入新表
String sql3 = "INSERT INTO \"user\" (\"_id\",\"sex\", \"name\",\"city\") SELECT \"_id\", \"age\" ,\"name\",\"city\" FROM \"_User_old_20160909\";";
db.execSQL(sql3);
//4.更新sqlite_sequence
String sql4 = "UPDATE \"sqlite_sequence\" SET seq = 3 WHERE name = 'user';";
db.execSQL(sql4);
/**
* 由于在Sqlite中使用自增长字段,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,所以要一起更新下。如果有没有设置自增长,则跳过此步骤。
* */
//5.删除临时表(这一步可以做,也可以不做)
String sql5 = "DROP TABLE _User_old_20160909;";
db.execSQL(sql5);
break;
}
}
四、添加新表
public DBHelper(Context context) {
super(context, "person.db", null, 5);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion){
case 5:
//添加一张表
db.execSQL("create table person (_id integer primary key autoincrement,age Integer(20),name varchar(20),city varchar(20))");
break;
}
}
好了,暂时就到这里了!未完待续…..