这里说的数据库版本指的是:我们的应用的程序的数据库的用户版本(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方法。