数据库更新(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; |