Android基础篇-五大存储方式之数据库升级篇

前面我已经讲解了数据库的基本操作,如果还没观看的可以稍微看下:
http://blog.csdn.net/qq_33750826/article/details/53036695

1.首先简单说下SQLiteOpenHelper类, 顾名思义就是一个SQL的帮助类,帮助我们管理Android数据库的,继承它需要实现**void onCreate(SQLiteDatabase db)void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)**两个方法,一个用于新建,一个用于升级,当然还必须重写其的一个构造方法,构造方法参数的含义上面这篇博客中我已经解释了,这里不再重复,需要的朋友可以去上面的地址查看

2.SQLiteDatabase类:这个类用于操作数据库增删改查,具体的增删改查我在上面博客已经提到,需要的朋友可以去上面的地址查看

3,进入正题代码:

         **3.1,创建一个类继承自SQLiteOpenHelper,第一版的数据库**
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDatabaseHelper extends SQLiteOpenHelper {

	public static final String CREATE_BOOK = "create table Book("
			+ "id integer primary key autoincrement," + "author text,"
			+ "price real," + "pages integer," + "name text)";

	
	public MyDatabaseHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_BOOK);
	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {

	}
}

         **3.2,新需求:向数据库中添加一张Category表
                添加表,数据库已经要发生改变了,所以这里就涉及到了数据库升级操作**
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;


/**
 * 第二版的数据库
 * @author wt
 *
 */
public class MyDatabaseHelperVersion2 extends SQLiteOpenHelper {

	public static final String CREATE_BOOK = "create table Book("
			+ "id integer primary key autoincrement," + "author text,"
			+ "price real," + "pages integer," + "name text)";

	public static final String CREATE_CATEGORY = "create table Category("
			+ "id integer primary key autoincrement," + "category_name text,"
			+ "category_code integer)";

	public MyDatabaseHelperVersion2(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		/*
		 * 当用户是直接安装第二版的程序时,就会将两张表一起创建,
		 * 而当用户是使用的第二版的程序覆盖第一版的程序时,就会进入到升级数据的操作中
		 * 
		 */
		db.execSQL(CREATE_BOOK);
		db.execSQL(CREATE_CATEGORY);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		switch (oldVersion) {
		//如果当前用户数据库的版本号为1,就只会创建一张Category表
		case 1:
			db.execSQL(CREATE_CATEGORY);
			break;
		default:
			break;
		}
	}

}

       3.3:再次升级,新需求: 这次要给Book表和Category表之间建立关联,需要在Book表中添加一个category_id的字段
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;


/**
 * 2新需求:
 *    这次要给Book表和Category表之间建立关联,
 *    需要在Book表中添加一个category_id的字段
 * @author wt
 *
 */
public class MyDatabaseHelperVersion3 extends SQLiteOpenHelper {

    /**
     *首先我们在Book表语句中添加了一个category_id列,
	 *这样当用户直接安装第三版程序时,这个新增的列就已经自动添加成功了
	*/
	public static final String CREATE_BOOK = "create table Book("
			+ "id integer primary key autoincrement," + "author text,"
			+ "price real," + "pages integer," + "name text"+"category_id integer)";

	public static final String CREATE_CATEGORY = "create table Category("
			+ "id integer primary key autoincrement," + "category_name text,"
			+ "category_code integer)";

	public MyDatabaseHelperVersion3(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		/*
		 * 当用户是直接安装第二版的程序时,就会将两张表一起创建,
		 * 而当用户是使用的第二版的程序覆盖第一版的程序时,就会进入到升级数据的操作中
		 * 
		 */
		db.execSQL(CREATE_BOOK);
		db.execSQL(CREATE_CATEGORY);
	}

	
	/**
	 * 然而,如果用户之前就已经安装了某一版本的程序,现在需要
	 * 覆盖安装,就会进入到升级数据库的操作中,在onUpgrade()
	 * 方法里,我们添加了一个新的case,如果当前数据库的版本号是2,
	 * 就会执行alter命令来为Book表新增category_id列
	 * 
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		switch (oldVersion) {
		/**
		 * 注意:这里的case语句是没有break的,为什么这样做呢?
		 *    这是为了在版本升级的时候,每一次的数据库修改都能被全部执行到
		 *    使用这种方式升级数据库,不管怎样更新,都可以保证
		 *    数据库中的表结构是最新的,而且表中的数据也完成不会丢失了
		 */
		case 1:
			db.execSQL(CREATE_CATEGORY);
		case 2:
			db.execSQL("alter table Book add column category_id integer");
		default:
		}
	}

}

以上根据需求讲解数据库的升级过程,过程就是如此So Easy,还不会的伙伴赶快敲起来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有头发的猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值