Android SQLite 升级数据版本
使用 SQLite
保存数据一个绕不过去的弯就是要频繁的对它进行升级数据版本,这种升级不是针对 SQLite
而是针对里面的数据
我们常常会出现这一种情况,上个版本刚在 SQLite
中建好的表,在这次需求中差一个字段,或者数据类型不对
比如,我们在上一个版本中创建了一个数据库 msdb.db
里面有一张用户表,只有两个字段 id
和 username
,然后这次需求需要保存用户的邮箱 email
,那么,就要对上一个版本的数据库 msdb.db
进行升级了
出现这种情况,我们就要对之前创建的 SQLite
数据进行升级了,以适应新版本
常见做法
升级 SQLite
中的数据,常见的做法是在 onUpdate()
中创建一个临时的数据库 A,然后把所有的数据读出来,进行修正,然后写到临时的数据库 A 中,再把老的数据库删掉,把新的数据库 rename
成老的数据库名
方法大概就是这样,但,具体实现过程中,坑多多
升级数据库版本实操
-
首先把所有升级数据库的操作都放到
onUpgrade()
方法中 -
在实例化自定义
SQLiteOpenHelper
的时候,修改版本号,比如把1
改成2
这样,就会自动调用 onUpgrade()
的方法了
对于每个数据库版本我们都应该做好相应的记录(文档),类似于下面这种
数据库版本 | andoid对应版本 | 内容 |
---|---|---|
v1.0 | 1 | 第一个版本,包含两个字段... |
v1.1 | 2 | 数据保留,新增 user_name 字段 |
升级 SQLite 数据版本中常见的疑问
-
应用升级,数据库文件是否会删除?
不会!数据什么的都在
-
如果我想删除表中某个字段或者增加一个新的字段,原先的数据还在吗?
在的!
-
假如我们已经升级到第三个版本了,我们在第二个版本增加了一个表,然后第三个版本也增加了一个表
现在有些用户直接从第一个版本升级到第三个版本,要怎么做?
很简单,可以在
onUpgrade()
里写一个if
语句对版本进行判断public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int arg2, int arg3) { if (arg2 < 2 ) { db.execSQL(第一个版本的建表语句); } if (arg2 < 3 ) { db.execSQL(第一个版本的建表语句); } if (arg2 < 4 ) { db.execSQL(第一个版本的建表语句); } }
当然了,这个方法可以改良,可以用一个数组来保存所有的语句,执行相应区间内的语句
-
旧表的设计太糟糕,很多字段要改,改动太多,想建一个新表,但是表名要一样
大部分都属于这种类型,就是缺个字段之类的
这里说一种很通用的方法
-
将旧表改名成临时表
ALTER TABLE User RENAME TO _temp_User;
-
创建新表
CREATE TABLE User (u_id INTEGER PRIMARY KEY,u_name VARCHAR(20),u_age VARCHAR(4));
-
导入数据
INSERT INTO User SELECT u_id,u_name,"18" FROM _temp_User;
原表中没有的要自己设个默认值
-
删除临时表
DROP TABLE_temp_User;
-