您当前的位置: 首页 >  面试
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

面试:Android数据库升级给表增加字段

沙漠一只雕得儿得儿 发布时间:2021-12-16 09:17:13 ,浏览量:0

一、升级数据库的方式

升级数据库

注意:修改数据库后,一定要记得增加数据库版本号 +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"。
关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.0392s