背景:
app升级,我们数据库发生改变的情况,如新增一张表、改变某张表中的字段名、添加一个新的字段等一系列表结构的改变
解决方案
1. 卸载当前版本,安装最新版的; 这种会造成数据丢失,基本不会考虑
2. 更新数据库;
更新数据库
情况1. 用户每次都更新应用,也就是数据库一级一级更新 v1到v2 v2到v3
情况2.用户好久没更新 跨版本升级 newVersion 6 oldversion2
方式1. 从2 依次升到3 到4 到6
方式2. 确定好2 和6 之间的数据库差异 直接由2的数据库结构升级到 6的数据库结构
方式1的优点是每次更新数据库的时候只需要在onUpgrade方法的末尾加一段从上个版本升级到新版本的代码,易于理解和维护,缺点是当版本变多之后,多次迭代升级可能需要花费不少时间,增加用户等待;
方式2的优点则是可以保证每个版本的用户都可以在消耗最少的时间升级到最新的数据库而无需做无用的数据多次转存,缺点是强迫开发者记忆所有版本数据库的完整结构,且每次升级时onUpgrade方法都必须全部重写。
以上是原理,下面看如何操作
重点是在update里面进行条件的划分,也就是上面的触发条件 实测创建同一个数据库传入不同version会调用update方法
数据库改变分两种形式
1.添加新表
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.e("MyDatebase","onUpgrade"); if (oldVersion==1){ db.execSQL("CREATE TABLE t_region(_id integer primary key autoincrement, region varchar, code varchar)"); //insert data... } }如果老版本是 1 那么我们在原有的数据库中添加一个新的表格(如果需求是这样) 这是创建表格
2.保持原有数据 添加新的字段 或者修改字段
a.将现有表重命名为临时表;
b.创建新表;
c.将临时表的数据导入新表(注意处理修改的列);
d.删除临时表。
db.execSQL("ALTER TABLE t_region RENAME TO t_region_temp"); db.execSQL("CREATE TABLE t_region(_id integer primary key autoincrement, region varchar, code varchar," + "country varchar)"); db.execSQL("insert into t_region(_id, region, code, country) " + "select _id, region, code, \"CHINA\" from t_region_temp"); db.execSQL("DROP TABLE t_region_temp");这样就完成表格的更改。