android开发数据库升级——版本迭代
数据库升级的意义
在应⽤程序开发的过程中,数据库的升级是⼀个很重要的组成部分(如果⽤到了数据库),因为程序可能会有V1.0,V2.0等版本,当⽤户安装新版本的程序后,必须要保证⽤户数据不能丢失,对于数据库设计,如果发⽣变更(如多添加⼀张表,表的字段增加或减少等),那么我们必须想好数据库的更新策略。
程序如何知道我们的数据库需要升级呢?
SQLiteOpenHelper类的构造函数有⼀个参数是version即数据库版本号,⽐如在软件1.0版本中,我们使⽤SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。到了2.0版本,我们的数据库需要发⽣变化,那么我们2.0版本的程序中就要使⽤⼀个⼤于1的整数来构造SQLiteOpenHelper类,⽤于访问新的数据库,⽐如2。当我们的2.0新程序读取1.0版本的⽼数据库时,就发现⽼数据库⾥存储的数据库版本是1,⽽我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。
当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不⼀样,就会⾃动调⽤onUpgrade函数,
在这个⽅法⾥对数据库进⾏升级。在这个函数中把⽼版本数据库的相应表中增加字段,并给每条记录增加默认值即可。新版本号和⽼版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。升级完成后,数据库会⾃动存储最新的版本号为当前数据库版本号
升级逻辑怎么写
假如我们开发的程序已经发布了两个版本:V1.0,V2.0,我们正在开发V3.0。每⼀版的数据库版本号分别是1,2,3。V1.0:user(username, password);
V2.0: user(username,password),
region(region, code);
V3.0: user(username,password),
android最新版region(region, code, country);
可以看出,第⼀次升级增加了⼀张表,⽽第⼆次升级在原有表基础上增加了⼀列。对于这种情况,我们应该如何实现升级?
V1.0->V3.0 DB 1-3
V2.0->V3.0 DB 2-3
SQLite提供了ALTER TABLE命令,允许⽤户重命名或添加新的字段到已有表中,并且只能在表的末尾添加字段
如何保证数据不丢失
遇到表结构改变太⼤,这种情况就需要新建⼀个表,把旧表的数据拷贝到新表⾥
1、重命名旧表名
ALERT TABLE TableA RENAME TO TableA_temp;
2、创建新表
create table TableA……
3、从旧表拷贝数据到新表
INSERT INTO TableA (Col1, Col2, Col3) SELECT (Col1, Col2, Col3) FROM TableA_temp;
注意
在onUpgrade()⽅法中,删除表时,注意使⽤事务处理,使得修改能⽴即反应到数据库⽂件中。
数据库中有些表存在某些关联,⽐如外键约束,当升级数据库时这些有关系的表的字段顺序⼀定要⼀致,否则升级时容易出现外键约束异常
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论