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、
一、软件v1.0
安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade。
1、v1.0(直接安装v1.0)
二、软件v2.0
有2种安装软件情况:
1、v1.0 --> v2.0 不走onCreate,走onUpgrade
2、v2.0(直接安装v2.0) 走onCreate,不走onUpgrade
v1.0版本只有一个account表,软件版本升级到v2.0了,但是v2.0数据库需要新增一个member表,那怎么办呢?这里有2种情况了:一种是安装了v1.0升级到v2.0,这时不会走继承SQLiteOpenHelper的onCreate,而是直接走onUpgrade,这时就要在onUpgrade添加member表的代码了,在onCreate加了也没用,因为这种情况都不走onCreate。。另一种情况就是用户从来没有安装过这个软件,直接安装v2.0,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade,所以要在onCreate添加member表的代码。这怎么办呢?这就要合理升级数据库版本了。
三、软件v3.0
假设v3.0又新增一个news表,这里有三种情况:
1、v1.0 --> v3.0 不走onCreate,走onUpgrade
2、v2.0 --> v3.0 不走onCreate,走onUpgrade
3、v3.0(直接安装v3.0) 走onCreate,不走onUpgrade
简单实例
1、建立一个android项目,添加一个类继承SQLiteOpenHelper类
2、先写一个1.0版本的,代码如下
public class Openhelp extends SQLiteOpenHelper { //创建数据库 private static final String DB_NAME="Text.db"; //数据库版本 private static final int version=1; public Openhelp(Context context) { super(context,DB_NAME,null,version); } //创建表 @Override public void onCreate(SQLiteDatabase db) { Log.i("hi", "没有数据库,创建数据库"); String sql="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50))"; db.execSQL(sql); Log.i("h1","1.0建立成功");//以日志输出 } //更新 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
更新为2.0版本,onUpgrade方法
public class Openhelp extends SQLiteOpenHelper { //创建数据库 private static final String DB_NAME="Text.db"; //数据库版本 private static final int version=2; public Openhelp(Context context) { super(context,DB_NAME,null,version); } //创建表 @Override public void onCreate(SQLiteDatabase db) { Log.i("hi", "没有数据库,创建数据库"); //直接更新到2.0版本 String sql="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50))"; String sql_1="insert into t_message values('小王','你好','11-25')"; String sql_2="insert into t_message values('小过','你好','11-26')"; String sql_3="insert into t_message values('小李','你好','11-24')"; db.execSQL(sql); db.execSQL(sql_1); db.execSQL(sql_2); db.execSQL(sql_3); Log.i("h1","2.0"); } //更新 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(oldVersion==1){ String sql="insert into t_message values('小李','你好','11-24')"; String sql_1="insert into t_message values('小王','你好','11-25')"; String sql_2="insert into t_message values('小过','你好','11-26')"; db.execSQL(sql); db.execSQL(sql_1); db.execSQL(sql_2); Log.i("hi","1.0到2.0更新成功"); } }
在更新到3.0的版本,也是使用onUpgrade方法
public class Openhelp extends SQLiteOpenHelper { //创建数据库 private static final String DB_NAME="Text.db"; //数据库版本 private static final int version=3; public Openhelp(Context context) { super(context,DB_NAME,null,version); } //创建表 @Override public void onCreate(SQLiteDatabase db) { Log.i("hi", "没有数据库,创建数据库"); //直接更新到3.0版本 String sql="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50),gender varchar(4))"; String sql_1="insert into t_message values('小王','你好','11-25','男')"; String sql_2="insert into t_message values('小过','你好','11-26','男')"; String sql_3="insert into t_message values('小李','你好','11-24','男')"; db.execSQL(sql); db.execSQL(sql_1); db.execSQL(sql_2); db.execSQL(sql_3); Log.i("h1","3.0成功"); } //更新 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //版本2更新到3版本 if(oldVersion==2){ String sql_add="alter table t_message add column gender varchar(4)"; db.execSQL(sql_add); Log.i("hi","2.0到3.0成功"); } //版本从1更新到3版本 if(oldVersion==1){ String sql_add="alter table t_message add column gender varchar(4)"; db.execSQL(sql_add); String sql="insert into t_message values('小李','你好','11-24','男')"; String sql_1="insert into t_message values('小王','你好','11-25','男')"; String sql_2="insert into t_message values('小过','你好','11-26','男')"; db.execSQL(sql); db.execSQL(sql_1); db.execSQL(sql_2); Log.i("hi","1.0到3.0更新成功"); } }
降版本,从3.0版本到2.0版本,onDowngrade方法和onUpgrade方法运用差不多
package list; import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class Openhelp extends SQLiteOpenHelper { //创建数据库 private static final String DB_NAME="Text.db"; //数据库版本 private static final int version=2; public Openhelp(Context context) { super(context,DB_NAME,null,version); } //创建表 @Override public void onCreate(SQLiteDatabase db) { Log.i("hi", "没有数据库,创建数据库"); //直接更新到3.0版本 String sql="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50),gender varchar(4))"; String sql_1="insert into t_message values('小王','你好','11-25','男')"; String sql_2="insert into t_message values('小过','你好','11-26','男')"; String sql_3="insert into t_message values('小李','你好','11-24','男')"; db.execSQL(sql); db.execSQL(sql_1); db.execSQL(sql_2); db.execSQL(sql_3); Log.i("h1","3.0成功"); } //更新 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //版本2更新到3版本 if(oldVersion==2){ String sql_add="alter table t_message add column gender varchar(4)"; db.execSQL(sql_add); Log.i("hi","2到3成功"); } //版本从1更新到3版本 if(oldVersion==1){ String sql_add="alter table t_message add column gender varchar(4)"; db.execSQL(sql_add); String sql="insert into t_message values('小李','你好','11-24','男')"; String sql_1="insert into t_message values('小王','你好','11-25','男')"; String sql_2="insert into t_message values('小过','你好','11-26','男')"; db.execSQL(sql); db.execSQL(sql_1); db.execSQL(sql_2); Log.i("hi","1.0到3.0更新成功"); } } //降级 @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { try { //改表名 String table="alter table t_message rename to t_message_back"; db.execSQL(table); Log.i("hi","修改表名成功"); //建立2.0表结构 String sql_1="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50))"; db.execSQL(sql_1); Log.i("hi","建立成功"); //copy String sql_2="insert into t_message select userName,message,datetime from t_message_back"; db.execSQL(sql_2); Log.i("hi","成功copy"); //删除备份表 String sql_3="drop table if exists t_message_back"; db.execSQL(sql_3); Log.i("hi","drp"); Log.i("hi","版本从3.0降到2.0版本"); } catch (Exception e) { //失败 Log.i("hi","失败,重新建立2.0版本"); //删除表 String sql="drop table if exists t_message"; //重新建立表 String sql_1="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50))"; String sql_2="insert into t_message values('小王','你好','11-25')"; String sql_3="insert into t_message values('小过','你好','11-26')"; String sql_4="insert into t_message values('小李','你好','11-24')"; db.execSQL(sql); db.execSQL(sql_1); db.execSQL(sql_2); db.execSQL(sql_3); db.execSQL(sql_4); } } }
就是这样,无论v1.0升级到v3.0,或者v2.0升级到3.0,还是v3.0直接安装,安装后的v3.0数据库结构都是一样的,理解透彻就是好