Android应用程序数据库版本升级

数据库实现方法中有必须继承两个方法:onCreate和onUpgrade,他们的调用过程如下:
1.如果数据库文件不存在,SQLiteOpenHelper在自动创建数据库后只会调用onCreate方法,在该方法中一般需要创建数据库中的表、视图等组件。在创建之前,数据库是空的,因此,不需要先删除数据库中相关的组件。
2.如果数据库文件存在,并且当前的版本号高于上次创建或升级时的版本号,SQLiteOpenHelper会调用onUpgrade方法,调用该方法后,会更新数据库版本号。在onUpgrade方法中除了创建表、视图等组件外,还需要首先删除这些相关的组件,因此,在调用onUpgrade方法之前,数据库是存在的,里面还有很多数据库组件。
3.综合上述两点,可以得出一个结论。如果数据库文件不存在,只有onCreate方法被调用(该方法只会在创建数据库时被调用1次)。如果数据库文件存在,并且当前版本较高,会调用onUpgrade方法来升级数据库,并更新版本号。

关于应用程序更新时版本号的升级,我引用别人的场景:
[quote]
我这里说的数据库版本指的是:我们的应用的程序的数据库的用户版本(user_version).比如说下面的情形:
2013年4月,我们第一次 发布了 我们的应用,数据库版本是1。
2013年5月,我们第二次 发布了 我们的应用,数据库版本是2。由于业务需要,我们更改了数据库里的某个表的表结构。
这时候就有这样的难题出现:
有些用户已经下载了4月份的版本1,并且已经使用了,很多数据存储在数据库了,这个时候,他想安装新的版本2,怎么办? 怎么才能让数据不丢失?
有的用户直接装了5月份的版本,那这些用户就直接使用了新的表结构格式。
可能以后还有版本3,4,N,怎么保证“数据不丢失的情况下“让用户手机里的数据库跟着升级?
------
我们记得SQLiteOpenHelper的onUpgrade方法,那么它是如何工作呢?我们该如何使用他?下面先说说使用它的方式。
[/quote]
解决方案:
我们在4月份数据库建立时,使用下面的方式

public class DatabaseHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = 1; // 数据库版本

public DatabaseHelper(Context context) {
super(context, DB_NAME, null, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(id integer primary key autoincrement , username varchar(20), password varchar(60));";
db.execSQL(sql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}


于是到了五月份,由于业务需要,我们想添加新的字段到这个表里。我们这样写代码:


public class DatabaseHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = 2; // 数据库版本

public DatabaseHelper(Context context) {
super(context, DB_NAME, null, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(id integer primary key autoincrement , username varchar(20), password varchar(60));";
db.execSQL(sql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 1 && newVersion == 2) {
// 从版本1到版本2时,增加了一个字段 desc
String sql = "alter table [user] add [desc] nvarchar(300)";
db.execSQL(sql);
}
}
}


如果数据库结构变化比较大,要做彻底的升级,怎么办?



public class DatabaseHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = 2; // 数据库版本

public DatabaseHelper(Context context) {
super(context, DB_NAME, null, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(id integer primary key autoincrement , username varchar(20), password varchar(60));";
db.execSQL(sql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//如果本次升级数据库完全变化很大,需要删除旧版本,建立新版本;
if (oldVersion == 1 && newVersion == 2) {
db.execSQL("drop table user;");
//自动调用onCreate
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值