新东西001--android数据库升级维护

写完一个APK不重要,重要的是后期不断的版本迭代;版本迭代不重要,重要的是不懂技术的提新功能有么有啊?你告诉我增加一个评论功能很简单,只要改一个地方,我想说我在数据库要多加张表做缓存啊,这种痛有么有人懂啊?这还不算痛,最痛的是,软件数据库版本到20,但没有数据库版本更新日志有么有啊?

看着SQLiteOpenHelper类里的onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion),静静躺着的

     db.execSQL("DROP TABLE IF EXISTS " + TableName);
我也是醉了,我真想问以前开发的哥们,你数据库以前更新过多少次啊?我该怎么做迭代啊,数据转移怎么做啊,有么有啊,多么痛的领悟....


根据上面的事实,总结了一些原则(只代表个人观点)

1.不管自己是不是apk的创始人(好高尚的名字),只要有对数据库表字段做修改,最好写日志(日志写在apk更新日志里,或者在SQLiteOpenHelper这个类里面),并且做好数据库升级处理(比如数据转移等)

2.尽量不要直接drop表(删除表),然后重新onCreate,如果有时间或者对以前数据库迭代版本清楚的,最好做好数据库转移操作


如何升级?

1.在SQLiteOpenHelper的初始化方法需要提供一个version(如下表的version),只要将这个version增大即可,一般在以前的数据库版本上+1,这样就可以保证在安装最新版本的apk的时候,会调用数据库更新的

        onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
2.当机器新安装一个apk,它会去看是否以前安装过

2.1 如果有以前的版本,系统首先会对比当前的跟以前版本的,如果<=以前的(比如用户用了最新的,觉得不好,又下载了以前的安装,这样就可以安装的低于当前版本),则不做处理,如果比以前的要大,则会调用系统的onUpgrade方法

2.2 如果没有以前的,则直接调用onCreate方法

3.基于上面的原理,我们在做数据库升级操作的时候,一定要处理好onCreate和onUpdate方法的关系,因为onCreate方法里你可以调用onUpdate,在onUpdate方法里可以调用onCreate,这也导致了很多人,在onUpdate方法里删除掉所有的表,再调用onCreate方法重创新表,以此来屏蔽表字段不存在的bug,但这样带来的问题是,数据没法重用


数据库如何增减字段

1.最繁琐的方法(以给表A增加两个字段为例)

1.1 更改表A的名字,改为表A_temp

1.2 创建新表A

1.3 读取表A_temp,将里面的内容插入到表A中

1.4 删除表A_temp

具体代码如下

          // 1.将表A改名为表A_temp
		 	String sql = "ALTER TABLE A RENAME TO A_temp";
			db.execSQL(sql);
			
			//2.创建表A
			db.execSQL("CREATE TABLE IF NOT EXISTS A (id integer primary key autoincrement,text varchar(40),text1 varchar(40),text2 varchar(40))");
			
			// 3.将A_temp的数据读取出来,转存A
			String sql2 = "INSERT INTO A (text) SELECT (text) FROM A_temp";
			db.execSQL(sql2);
			
			// 4.删除A_temp表
			db.execSQL("DROP TABLE IF EXISTS A_temp");

2.最简单的方式(对sql熟悉的,在保留原始数据的情况下增加一个字段)

2.1 给表A增加/删除一个字段

	String sql="ALTER TABLE A ADD text1 varchar(40)";(同理:String sql="ALTER TABLE A DROP text1";给表A删除一个字段)
2.2 给表A增加多个字段
在网上上并未搜索到相关资料,自己思考的结果是添加比较少的字段就用2.1的的命令一条一条加,如果比较多的就按1.1的方式重新建表倒数据

数据库操作优化

在执行db.execSQL之前使用事务(在博客看别人统计,小批量数据,事务不占优势,但数据量超过1000条的时候,有明显优势,小数量语句使用sql语句拼凑比较快)

1.使用事务

1.1 db.beginTransaction()

1.2 执行db.execSQL方法,可以有多条db.execSQL调用语句

1.3 db.setTransactionSucessful()

1.4 db.endTransaction()

2.拼凑sql语句(将多条拼凑到一条作为命令执行)

2.1 db.execSQL("insert into A(test) select 'aa'" +"union all select 'bb'");



知识不定时补充,更新,欢迎大家补充(可直接在下方留言,大家一起学习),个人博客也在建设当中,希望大家到时候多支持,一起分享进步



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值