android 开发 数据库升级——版本迭代

本文讲述了Android应用程序中数据库升级的重要性,通过SQLiteOpenHelper的版本号对比自动触发升级。在onUpgrade()方法中,根据不同的版本变化执行相应的升级逻辑,如ALTER TABLE命令添加字段或重建表来迁移数据。同时强调了保证数据不丢失和处理表间关联的注意事项。

数据库升级的意义

在应用程序开发的过程中,数据库的升级是一个很重要的组成部分(如果用到了数据库),因为程序可能会有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),  

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()方法中,删除表时,注意使用事务处理,使得修改能立即反应到数据库文件中。

数据库中有些表存在某些关联,比如外键约束,当升级数据库时这些有关系的表的字段顺序一定要一致,否则升级时容易出现外键约束异常


数据库迭代查询作业 emp(eno, ename, salary, mgr),其中mgr是员工领导,设计约束:要求领导的工资不能低于他的下属平均工资。(注意,这是一个递归查询) 下面是一些样例数据 CREATE TABLE dbo.Employees ( empid INT NOT NULL PRIMARY KEY, mgrid INT NULL REFERENCES dbo.Employees, empname VARCHAR(25) NOT NULL, salary MONEY NOT NULL, CHECK (empid mgrid) ); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(1, NULL, 'David', $10000.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(2, 1, 'Eitan', $7000.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(3, 1, 'Ina', $7500.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(4, 2, 'Seraph', $5000.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(5, 2, 'Jiru', $5500.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(6, 2, 'Steve', $4500.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(7, 3, 'Aaron', $5000.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(8, 5, 'Lilach', $3500.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(9, 7, 'Rita', $3000.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(10, 5, 'Sean', $3000.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(11, 7, 'Gabriel', $3000.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(12, 9, 'Emilia' , $2000.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(13, 9, 'Michael', $2000.00); INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES(14, 9, 'Didi', $1500.00);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值