Android学习之数据库升级

     由于Android的数据库SQLite是自带的,故随着我们的应用App升级,相对应的数据库里面的内容发生改变时也要随之升级,升级的时候希望的是之前保存的数据不丢失的情况下对其进行升级。这时就要用到Andoird的SQLiteOpenHelper类中有一个onUpgrade方法,当前数据库版本变化时就触发该方法对数据库进行升级。

       1. 数据库升级是指什么?

         你开发了一个程序,当前是1.0版本。该程序用到了数据库。到1.1版本时,你在数据库的某个表中增加了一个字段。那么软件1.0版本用的数据库在软件1.1版本就要被升级了。

       2. 数据库升级应该注意什么?

         软件的1.0版本升级到1.1版本时,老的数据不能丢。那么在1.1版本的程序中就要有 地方能够检测出来新的软件版本与老的数据库不兼容,并且能够有办法把1.0软件的数据库升级到1.1软件能够使用的数据库。换句话说,要在1.0软件的数 据库的那个表中增加那个字段,并赋予这个字段默认值。

       3. 程序如何知道数据库需要升级?

          SQLiteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号。比如在软件1.0版本中,我们使用SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。
到了1.1版本,我们的数据库需要发生变化,那么我们1.1版本的程序中就要使用一个大于1的整数来构造SQLiteOpenHelper类,用于访问新的数据库,比如2。
当我们的1.1新程序读取1.0版本的老数据库时,就发现老数据库里存储的数据库版本是1,而我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。

       4. 何时触发数据库升级?如何升级?

           当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。根据上述场景,在这个函数中把老版本数据库的相应表中增加字段,并给每条记录增加默认值即可。新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。

        SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。

       以下面的代码为例:

   第一次创建数据库,版本号为1:

public class CopyOfDatabaseHelper extends SQLiteOpenHelper {
	private static final String DB_NAME = "scxh1502.db"; // 数据库名
	private static final int DB_VERSION = 1; // 数据库版本号

	private static CopyOfDatabaseHelper DB_HELPER = null;

	public static CopyOfDatabaseHelper getInstanceDatabaseHelper(Context context) {
		if (DB_HELPER == null) {
			DB_HELPER = new CopyOfDatabaseHelper(context);
		}
		return DB_HELPER;
	}

	public CopyOfDatabaseHelper(Context context) {
		super(context, DB_NAME, null, DB_VERSION);
	}

	/**
	 * 数据库创建时执行
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "create table " + DataColumn.Student.TABLE_NAME + " ("
				+ DataColumn.Student._ID
				+ " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
				+ DataColumn.Student.COLUMN_NAME_NAME + " TEXT, "
				+ DataColumn.Student.COLUMN_NAME_NUMBER + " TEXT " + ")";

		db.execSQL(sql);
	}

	/**
	 * 数据库版本发生变化
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	}
}


     第一次数据库升级,版本号为2,添加一个Age字段:

public class CopyOfDatabaseHelper extends SQLiteOpenHelper {
	private static final String DB_NAME = "scxh1502.db";  //数据库名
	private static final int DB_VERSION = 2;  //数据库版本号

	private static CopyOfDatabaseHelper DB_HELPER = null;

	public static CopyOfDatabaseHelper getInstanceDatabaseHelper(Context context) {
		if (DB_HELPER == null) {
			DB_HELPER = new CopyOfDatabaseHelper(context);
		}
		return DB_HELPER;
	}

	public CopyOfDatabaseHelper(Context context) {
		super(context, DB_NAME, null, DB_VERSION);
	}
	/**
	 * 数据库创建时执行
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "create table "+DataColumn.Student.TABLE_NAME
				+ " (" 
				+ DataColumn.Student._ID + " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
				+ DataColumn.Student.COLUMN_NAME_NAME + " TEXT, "
				+ DataColumn.Student.COLUMN_NAME_NUMBER + " TEXT "
				+ ")";

		db.execSQL(sql);
	}

	/**
	 * 数据库版本发生变化
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			String sql = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_AGE+" TEXT ";
			db.execSQL(sql);
	}
}


       第二次升级数据库,版本号为3,添加一个成绩字段:

public class CopyOfDatabaseHelper extends SQLiteOpenHelper {
	private static final String DB_NAME = "scxh1502.db";  //数据库名
	private static final int DB_VERSION = 3;  //数据库版本号

	private static CopyOfDatabaseHelper DB_HELPER = null;

	public static CopyOfDatabaseHelper getInstanceDatabaseHelper(Context context) {
		if (DB_HELPER == null) {
			DB_HELPER = new CopyOfDatabaseHelper(context);
		}
		return DB_HELPER;
	}

	public CopyOfDatabaseHelper(Context context) {
		super(context, DB_NAME, null, DB_VERSION);
	}
	/**
	 * 数据库创建时执行
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "create table "+DataColumn.Student.TABLE_NAME
				+ " (" 
				+ DataColumn.Student._ID + " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
				+ DataColumn.Student.COLUMN_NAME_NAME + " TEXT, "
				+ DataColumn.Student.COLUMN_NAME_NUMBER + " TEXT "
				+ ")";

		db.execSQL(sql);
	}

	/**
	 * 数据库版本发生变化
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		if(oldVersion < 2){//当数据库版本小于版本2时,就要升级下面的所有字段
			String sql = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_AGE+" TEXT ";
			db.execSQL(sql);
		}
		//当前版本为2时就只升级下面的字段
		String sql1 = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_SCORE+" TEXT ";
		db.execSQL(sql1);
	}
}

      升级数据库时我们就要考虑全面,若不加上判断语句判断版本号,若之前2版本用户没有升级就直接升级到3,就会漏掉字段,故升级时所有的情况都应该考虑进去。

 

 

你可能感兴趣的:(Android学习之数据库升级)