您的位置:首页 > 移动开发 > Android开发

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

2016-11-05 09:26 197 查看
前面我已经讲解了数据库的基本操作,如果还没观看的可以稍微看下:

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,还不会的伙伴赶快敲起来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐