app开发期间的数据库升级
我们使用DevOpenHelper打开数据库1
2 DaoMaster.DevOpenHelper helper =
new DevOpenHelper(application,"xue_old.db",null);
DevOpenHelper内容1
2
3
4
5
6
7
8
9
10
11
12public static class DevOpenHelper extends OpenHelper {
public DevOpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
dropAllTables(db, true);
onCreate(db);
}
}
其中
1 | //删除当前所有表 |
这种方式意味着每次都重新创建,所以数据不会报错
app 上线后的数据库升级,Migration(合并)方式
我们自己新建一个HMROpenHelper,继承自OpenHelper1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class HMROpenHelper extends DaoMaster.OpenHelper {
public HMROpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
/**
* 数据库升级
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//操作数据库的更新
MigrationHelper.migrate(db,NoteDao.class,LessonDao.class,ZhangDao.class);
}
}
数据库的合并如下
MigrationHelper.java
1 | public class MigrationHelper { |
其核心思路是
1 把旧表改为临时表
2 建立新表
3 临时表数据写入新表,删除临时表
这样我们就可以直接打开数据库进行更新操作了1
2
3HMROpenHelper helper = new HMROpenHelper(application, "xue_old.db", null);
SQLiteDatabase sqlDB = helper.getWritableDatabase();
return sqlDB;
重点
别忘了更新时SCHEMA_VERSION
自动加1,不然不会执行更新
位于DaoMaster.java