1.背景
在版本迭代时,有时候需要对数据库进行升级,而GreenDAO默认的DaoMaster.DevOpenHelper在进行数据升级时,会把旧表删除,然后创建新表,并没有迁移旧数据到新表中,从而造成数据丢失。 这在实际中是不可取的,因此我们需要作出调整。下面介绍数据库升级的步骤与要点。
2.操作步骤
-
1 复制MigrationHelper到项目,网上有不少MigrationHelper的源码,这里采用的是https://github.com/yuweiguocn/GreenDaoUpgradeHelper中的MigrationHelper,它主要是通过创建一个临时表,将旧表的数据迁移到新表中,大家可以去看下源码。
-
2 新建一个类,继承DaoMaster.OpenHelper ,重写onUpgrade(Database db, int oldVersion, int newVersion)方法,在该方法中使用MigrationHelper进行数据库升级以及数据迁移。
public class MyOpenHelper extends DaoMaster.OpenHelper {
public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
//把需要管理的数据库表DAO作为最后一个参数传入到方法中
MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
@Override
public void onCreateAllTables(Database db, boolean ifNotExists) {
DaoMaster.createAllTables(db, ifNotExists);
}
@Override
public void onDropAllTables(Database db, boolean ifExists) {
DaoMaster.dropAllTables(db, ifExists);
}
}, BeanDao.class); // 修改beanDao对象
}
}
- 然后使用MyOpenHelper替代DaoMaster.OpenHelper来进行创建数据库等操作
//建库
mSQLiteOpenHelper = new MyOpenHelper(MyApplication.getInstance(), DB_NAME);
mDaoMaster = new DaoMaster(mSQLiteOpenHelper.getWritableDatabase());
mDaoSession = mDaoMaster.newSession();
- 4 修改实体对象的字段
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
private String name;
private String content;
private String money; //添加的字段
-
5 编译—重要
-
6 修改Module下build.gradle中数据库的版本号schemaVersion ,递增加1即可,最后运行app
greendao {
//数据库版本号,升级时进行修改
schemaVersion 2
daoPackage 'com.dev.base.model.db'
targetGenDir 'src/main/java'
}