SQLite在Android系统中的使用方法(5)

发表于:2013-01-04来源:ImportNew作者:赵荣点击数: 标签:Android
数据库更新(Upgrades) 再回到数据库管理上来,让我们看一下有点小复杂的情况,数据库更新。经过一段时间的使用和开发,应用程序往往会发生变化,也许

  数据库更新(Upgrades)

  再回到数据库管理上来,让我们看一下有点小复杂的情况,数据库更新。经过一段时间的使用和开发,应用程序往往会发生变化,也许会添加新的功能,也许做了某些优化。这些变化也许需要数据库结构发生变化,并且在数据库更新代码中,通过数据库版本这个值来反映出这次更新。

  在更新数据库时有个潜在问题,那就是有可能导致先前版本的数据库数据丢失。另外,一旦我们的应用版本超过了两个,我们不能武断的假设用户总是已经更新到最新的版本了,比如说现在发布的版本是version3.0,那么不能假设所有用户都已经更新到version2.0了,所以我们的更新操作不能是简单的从一个版本更新到下一本版本。

  那么怎么处理这种问题呢?我们已经知道当有一个新版本数据库的时候,onUpgrade()方法就会被调用,所以理想的做法是我们在这个方法中判断数据库版本,决定执行一段或者多段更新脚本。

  让我们看一下我们的例子中,在2.0版本中要做哪些修改:

  电话号码格式标准化(分机号,手机号),将电话号码存到一张独立的“numbers”数据表。

  在雇员数据表中增加一个薪水字段。

  以版本1数据库为更新点,可以通过下面的SQL脚本实现更新数据库操作,并且将原来版本中的数据导入到新版本数据库中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE numbers (
   _id INTEGER PRIMARY KEY AUTOINCREMENT,
   employid INTEGER NOT NULL,
   number TEXT NOT NULL,
   ntype INTEGER NOT NULL DEFAULT '0'
);
CREATE INDEX employid ON numbers(employid);
 
INSERT INTO numbers (employid, number, ntype) SELECT _id, ext, 0
   FROM employees;
INSERT INTO numbers (employid, number, ntype) SELECT _id, mob, 1
   FROM employees;
 
CREATE TABLE temp (
     _id INTEGER PRIMARY KEY AUTOINCREMENT,
     name TEXT NOT NULL,
     salary INTEGER NOT NULL DEFAULT '0'
);
INSERT INTO temp (_id, name) SELECT _id, name FROM employees;
 
DROP TABLE employees;
ALTER TABLE temp RENAME TO employees;

原文转自:http://www.ltesting.net