Android SQLite数据库版本更新

来源:互联网 发布:linux apache 框架 编辑:程序博客网 时间:2024/05/16 15:41
Android SQLite数据库版本更新
面试中经常会问到Android 中SQLite 数据库版本的更新问题,我们需要怎样去回答呢?
下面是本人的一些认识,仅供参考。

当你创建一个类并继承SqliteOpenHelper时,会要求你实现他的两个回调方法:onCreate()onUpgrade()方法。
顾名思义,onCreate()方法就是就是创建数据库时调用,onUpgrade()就是在更新数据库的版本时调用。
假如你开发了一个应用,当前是1.0版本,并且使用了数据库。过一段时间后你更新了这个应用,变成了2.0版本,并且数据库的表也增加了一个字段或者减少了一个字段,
这个时候你就要对数据库进行更新,而且要保证原来1.0版本的数据在更新的过程中不丢失(一般要求)。

那么我们要怎样来更新数据库呢?
其实SqliteOpenHelper的构造方法里有一个参数是int version, 意思是指当前数据库的版本。比如我们的1.0应用中数据库版本是1,当我们需要在2.0版本的应用中改变数据库(可能是增加一个字段,或者是删除一个字段等),我们就要设置int verison的值大于前面一个版本的数据库版本的值,例如改为2,就会触发onUpgrade()方法。
另外新版本号跟旧版本号都会作为onUpgrade()方法的参数传进来,我们就可以知道是从哪个版本升级到哪个版本。
根据上述场景,我们就可以在onUpgrade()方法中进行更新数据库操作。
升级完成后,数据库会自动存储最新的版本号作为当前数据库的版本。

随着应用的不断升级,原有的数据结构可能已经不再适应新功能,这个时候我们就应该对SQLite数据库的结构进行升级。
SQLite 提供了ALTER TABLE的命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。
并且只能在表的末尾添加字段,比如,我们要在User 表中添加两个字段:
1. ALTER TABLE User ADD COLUMN Sex TEXT;
2. ALTER TABLE User ADD COLUMN Birthday TEXT;

另外如果遇到了复杂的数据库操作,例如在修改的同时,需要进行数据的转移,那么可以采取在一个事务中执行如下语句来实现修改表的需求。
1. 将表改为临时表
ALTER TABLE User RENAME TO _TEMP_User;
2. 创建新的表
CREATE TABLE User (Userid text primary key not null, Sex text not null,Birthday text not null,Name text not null);
3. 导入数据
INSERT INTO User SELECT Userid,"","",Name FROM TO_TEMP_User;
或者
INSERT INTO User() SELECT Userid,"","",Name FROM TO_TEMP_User;
*注意,“”是用来补充原来不存在的数据的。4. 删除临时表
DROP TABLE _TEMP_User;

通过以上4步,就可以实现旧数据库结构向新数据库结构的迁移,并且可以实现在迁移的过程中数据不改变(不丢失)。
当然,如果我们遇到是要减少数据库表字段的,也可以通过建立临时表来实现。
举个例子,如下

public class DBservice extends SQLiteOpenHelper{private String CREATE_BOOK = "create table book(bookId integer primarykey,bookName text);";private String CREATE_TEMP_BOOK = "alter table book rename to _temp_book";private String INSERT_DATA = "insert into book select *,'' from _temp_book";private String DROP_BOOK = "drop table _temp_book";public DBservice(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {switch (newVersion) {case 2:db.execSQL(CREATE_TEMP_BOOK);db.execSQL(CREATE_BOOK);db.execSQL(INSERT_DATA);db.execSQL(DROP_BOOK);break;}}











1 0
原创粉丝点击