一、升级数据库的方式
升级数据库
注意:修改数据库后,一定要记得增加数据库版本号 +1 . 否则不会走onUpgrade方法.
最残暴的方法:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
onCreate(db);
}
直接删表, 数据全都没了.在正常的产品项目中是不可能这么干的。
升级数据库版本号要比老的版本大,但是跨版本升级时需要判断好中间版本号,依次升级,
以下面场景为例:第一次创建数据库,版本号为1;
第一次数据库升级,版本号为2,添加一个Age字段;
/**
* 数据库版本发生变化
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_AGE+" TEXT ";
db.execSQL(sql);
}
第二次升级数据库,版本号为3,添加一个成绩字段;
/**
* 数据库版本发生变化
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(oldVersion < 2){//当数据库版本小于版本2时,就要升级下面的所有字段
String sql = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_AGE+" TEXT ";
db.execSQL(sql);
}
//当前版本为2时就只升级下面的字段
String sql1 = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_SCORE+" TEXT ";
db.execSQL(sql1);
}
升级数据库时我们就要考虑全面,若不加上判断语句判断版本号,若之前2版本用户没有升级就直接升级到3,就会漏掉字段,故升级时所有的情况都应该考虑进去。否则会出现中间升级版本字段漏掉的情况。
二、数据库表中增加或删除字段在 onUpgrade 中做添加字段或者删除字段的操作!!!!注意:这里有两种需求!!
第一种:不需要保留原表的数据,在我现在公司项目中有一张表要修改一个列名,但是每次使用的都是新数据,所以可以直接删除原表,再重新创建表!
第二种:需要保留原数据,只不过后续app的版本添加了功能需要在该表中使用新的列!这里我解决的是第二种情况,也就是需要保留原数据的情况!
(1)将原来的表更改名字为一张临时表: "alert table user rename to_temp_user" ,临时表名可以自己定义,我定义的是 _temp_+原表名 ,比如原表名为 user 表,临时表名就为 _temp_user 。
(2)创建一张新表,表名为原来的表名,注意:这里的新表中的列要有你需要添加的列,并将新的列添加的原表中的末尾:"create table if not exists user(表中列名和数据类型,多个列以,逗号隔开 )" 。
(3)将临时表的数据复制到名字为原来表名的新表(这里有一点要注意,因为新的列是在末尾,所以这里我们要预留值给新列,如果没有预留值我也不知道会出什么问题。。。欢迎博友给出意见!!)具体的实现细节在接下来的sql语句中体现:"insert into user select *,' ' from _temp_user" ,这里select * 之后的单引号之间有空格,如果添加多个字段就添加多个' ',以逗号隔开,比如添加两个字段:"insert into user select *,' ',' ' form _temp_user",意思就是给新添加的列赋值为 ' ' !!
(4)将临时表删除,数据已经复制完毕,有新添加列的表已经生成并保留了数据,临时表已经没用利用价值了,删吧,任性一回!!删除sql语句:"drop table _temp_user"。