写完一个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'");
知识不定时补充,更新,欢迎大家补充(可直接在下方留言,大家一起学习),个人博客也在建设当中,希望大家到时候多支持,一起分享进步