赞
踩
方法是从《第一行代码》中改写过来的
onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion)方法在数据库版本变高之后会执行,
当我们数据库为第一版时,只有一个Book表,创建比较简单,只用在onCreate里新建一个Book即可
public class MySql extends SQLiteOpenHelper{
private static final String CREATE_BOOK =
"create table Book("+"id integer primary key)";
public MySql(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
}
}
但是之后我们需要新添一个Category表则我们需要修改我们的代码,现在Mysql变成这样
public class MySql extends SQLiteOpenHelper{
private static final String CREATE_BOOK =
"create table Book("+"id integer primary key)";
private static final String CREATE_CATEGORY=
"create table Category("+"id integer primary key")";
public MySql(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@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){
case 1:
db.execSQL(CREATE_CATEGORY);
default;
}
}
}
我们再onUpgrade()中添加了一个switch判断,如果当前的版本为1的话,就只会创建Category表。如果用户安装新的程序第二版的程序,则会直接创建两个表Book Category,如果用户用第二版覆盖第一版的程序,旧版本数据库版本号为1,则只会创建Category表,因为Book还存在,所以达到了升级数据库的目的。
但是过了没多久,我们需要在Book表中增加一个name字段,再次修改代码
public class MySql extends SQLiteOpenHelper{
private static final String CREATE_BOOK =
"create table Book("+"id integer primary key,
"+"name text)";
private static final String CREATE_CATEGORY=
"create table Category("+"id integer primary key")";
public MySql(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@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){
case 1:
db.execSQL(CREATE_CATEGORY);
case 2:
db.execSQL("alter table Book add column name text");
default;
}
}
}
首先我们再Book建表语句中加入了name列,这样当用户直接安装第三版的程序,新增的字段就在Book表内了。如果用户是覆盖安装的话,注意我们的case后面没有跟break,假设现在第一版的用户安装,则会执行更新数据库的操作,判断oldVersion为1则依次执行db.execSQL(CREATE_CATEGORY);
db.execSQL("alter table Book add column name text");
这两段代码更新数据库。
如果现在为第二版的用户安装,则从case2来更新数据库,所以只会执行db.execSQL("alter table Book add column name text");
这段代码来更新数据库,从而达到了不同版本正确更新数据库的目的。
终于写完了,抽了个烟头晕死了 滚去睡觉了
~。~
`
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。