前言
大家好久不见,一转眼马上八月份下旬了,最近由于工作比较忙,没时间给大家更新博文。百忙之中抽出时间,给大家来更新一篇关于GreenDao3+数据库的升级。
关于GreenDao的详细介绍以及一些逻辑性的增、删、改、查
等,可以参考我去年写的一篇文章,《Android GreenDao 3.2.2的详解以及实战(附Demo)》
在版本迭代时,我们经常需要对数据库进行升级,而GreenDao默认的DaoMaster.DevOpenHelper
在进行数据升级时,会把旧表删除,然后创建新表,并没有迁移旧数据到新表中,从而造成数据丢失。
这在实际开发项目应用中是不可取的,因此我们需要作出调整。
当然了在此之前,自己也调研并且咨询了一下度娘,发现好多文章写的比较杂乱,最终按照实际操作之后也并没有达到预期效果,但是大部分都是对于数据库版本升级 都是在onUpgrade(Database db,int olbVersion,int newVersion)
方法中进行处理的。
最终也并不是没有解决办法,网上有不少关于MigrationHelper的源码
,它主要是通过创建一个临时表,将旧表的数据迁移到新表中,大家可以自行去百度看源码吧。接下来,说一下我个人实际操作吧!
项目实战
这里用的是于卫国 大佬封装好的
GreenDaoUpgradeHelper
,它是一个GreenDao的
数据库升级帮助类
。使用它可以很容易解决数据库升级问题,并且只需要一行代码。
1、导入依赖 :implementation 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.1.0'
2、新建一个类,继承DaoMaster.OpenHelper
,重写onUpgrade(Database db,int olbVersion,int newVersion)
方法,在该方法中使用MigrationHelper
进行数据库升级以及数据迁移。
c
MigrationHelper.migrate(Database db,
new MigrationHelper.ReCreateAllTableListener() {
}, xxxDao.class);
db:数据库操作对象
ReCreateAllTableListener:重新创建表的监听器
xxxDao.class:对应bean的数据库操作对象
c
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);
}
}, RecordBeanDao.class);// 修改beanDao对象
}
}
3、在数据库初始化的地方,使用MyOpenHelper替代DaoMaster.DevOpenHelper来进行创建数据库等操作。
c
//封装数据库的创建、更新、删除
MyOpenHelper openHelper = new MyOpenHelper(AppApplication.getContext(),DB_NAME,null);
//获取数据库
SQLiteDatabase mDb = openHelper.getWritableDatabase();
//封装数据库中表的创建、更新、删除
DaoMaster mDaoMaster = new DaoMaster(mDb); //合起来就是对数据库的操作
//对表操作的对象。
DaoSession mSession = mDaoMaster.newSession(); //可以认为是对数据的操作
4、修改实体对象的字段
c
@Entity
public class RecordBean {
@Id
private Long id;
private String name;
private String age; // 添加的字段
5、执行编译(重点),目的让bean对象重新生成配置信息和Dao类。
6、修改app下的gradle数据库信息,build.gradle中数据库的版本号schemaVersion
,递增加1即可,最后运行app。
c
greendao {
// 数据库版本号,升级时及时修改
schemaVersion 2
daoPackage 'com.harry.greendaomaster.greendao.gen' // 设置DaoMaster、DaoSession、Dao包名
targetGenDir 'src/main/java' // 设置DaoMaster、DaoSession、Dao目录
}
最后
经过实际项目应用中,发现无论是删除表单也好,还是修改或者删除表单字段也好,都实测有效。并且,旧数据也会做保留不会丢失。
最后,这是我个人项目中的需求,大家也需要按照个人需求来实际开发。欢迎大家,留言探讨,共同学习!