Android中数据库升级使用SQLiteOpenHelper类onUpgrade方法说明

这里说的数据库版本指的是:我们的应用的程序的数据库的用户版本(user_version).比如说下面的情形:

2013年4月,我们第一次 发布了 我们的应用,数据库版本是1。

2013年5月,我们第二次 发布了 我们的应用,数据库版本是2。由于业务需要,我们更改了数据库里的某个表的表结构。

这时候就有这样的难题出现:

有些用户已经下载了4月份的版本1,并且已经使用了,很多数据存储在数据库了,这个时候,他想安装新的版本2,怎么办? 怎么才能让数据不丢失?

有的用户直接装了5月份的版本,那这些用户就直接使用了新的表结构格式。

可能以后还有版本3,4,N,怎么保证“数据不丢失的情况下“让用户手机里的数据库跟着升级?

------

我们记得SQLiteOpenHelper的onUpgrade方法,那么它是如何工作呢?我们该如何使用他?下面先说说使用它的方式。

解决方案:

我们在4月份数据库建立时,使用下面的方式 

public class DBHelper extends SQLiteOpenHelper { 

private static final int VERSION = 1;

private SQLiteDatabase database;

public DBHelper(Context c, String dbName) {

 super(c, dbName, null, VERSION);
 database = getWritableDatabase();

}

public SQLiteDatabase getDatabase() {

return database;

}

public void closeDB() {

database.close();

}

 @Override
 public void onCreate(SQLiteDatabase db) {

  Log.i("persistence init", "creating table draftbox");
  db.execSQL("create table if not exists draftbox(pkid integer primary key autoincrement,formcode varchar(20),date datetime,summary varchar(100), context text) ");

 }

@Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

}

我们看到,在这里,我们的onCreate方法里,写个建表的语句,这个表有3个字段。

于是到了五月份,由于业务需要,我们想添加新的字段到这个表里。我们这样写代码

public class DBHelper extends SQLiteOpenHelper { 

private static final int VERSION = 2;

private SQLiteDatabase database;

public DBHelper(Context c, String dbName) {

 super(c, dbName, null, VERSION);
 database = getWritableDatabase();

}

public SQLiteDatabase getDatabase() {

return database;

}

public void closeDB() {

database.close();

}

 @Override
 public void onCreate(SQLiteDatabase db) {

  Log.i("persistence init", "creating table draftbox");
  db.execSQL("create table if not exists draftbox(pkid integer primary key autoincrement,formcode varchar(20),date datetime,summary varchar(100), context text, imagefolder varchar(50)) ");

 }

@Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

if(oldVersion == 1 && newVersion == 2){

//从版本1到版本2时,增加了一个字段 imagefolder
String sql = "alter table draftbox add [imagefolder] varchar(50)";
db.execSQL(sql);

}

}

}

这个时候,onCreate方法里,是新的建立表的方式。而不同的是 onUpgrade方法里我们检测了这样的变化,如果 是从版本1到版本2,我们执行了一段”添加列的sql语句“。这段代码,仅仅在符合这样的场景里执行。

通过上面的方式,我们就完成了一次的数据库升级的操作。android会判断 数据库的版本号,并自动的调用onUpgrade方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值