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

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

关于应用程序更新时版本号的升级,我引用别人的场景:
引用

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

解决方案:
我们在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
		}
	}
}

猜你喜欢

转载自gqdy365.iteye.com/blog/1978281