Android GreenDao数据库升级(附Demo)

前言

大家好久不见,一转眼马上八月份下旬了,最近由于工作比较忙,没时间给大家更新博文。百忙之中抽出时间,给大家来更新一篇关于GreenDao3+数据库的升级

关于GreenDao的详细介绍以及一些逻辑性的增、删、改、查等,可以参考我去年写的一篇文章,《Android GreenDao 3.2.2的详解以及实战(附Demo)》


在版本迭代时,我们经常需要对数据库进行升级,而GreenDao默认的DaoMaster.DevOpenHelper在进行数据升级时,会把旧表删除,然后创建新表,并没有迁移旧数据到新表中,从而造成数据丢失。

这在实际开发项目应用中是不可取的,因此我们需要作出调整。

当然了在此之前,自己也调研并且咨询了一下度娘,发现好多文章写的比较杂乱,最终按照实际操作之后也并没有达到预期效果,但是大部分都是对于数据库版本升级 都是在onUpgrade(Database db,int olbVersion,int newVersion)方法中进行处理的。

最终也并不是没有解决办法,网上有不少关于MigrationHelper的源码,它主要是通过创建一个临时表,将旧表的数据迁移到新表中,大家可以自行去百度看源码吧。接下来,说一下我个人实际操作吧!

项目实战

这里用的是于卫国 大佬封装好的GreenDaoUpgradeHelper

它是一个GreenDao的数据库升级帮助类

使用它可以很容易解决数据库升级问题,并且只需要一行代码。

https://github.com/yuweiguocn/GreenDaoUpgradeHelper

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目录
 }

最后

经过实际项目应用中,发现无论是删除表单也好,还是修改或者删除表单字段也好,都实测有效。并且,旧数据也会做保留不会丢失。

最后,这是我个人项目中的需求,大家也需要按照个人需求来实际开发。欢迎大家,留言探讨,共同学习!

项目地址:Android GreenDao数据库升级

相关推荐
志栋智能10 小时前
从“成本中心”到“效率引擎”:超自动化巡检的转型之路
运维·数据库·自动化
weixin_5689960610 小时前
Golang怎么实现跳表数据结构_Golang如何用Skip List实现有序数据的快速查找【方法】
jvm·数据库·python
lxysbly10 小时前
安卓土星ss模拟器下载(支持中文、金手指)
android
蜜獾云10 小时前
交易系统之数据库弱依赖解决方案
数据库·oracle
卢傢蕊10 小时前
NoSQL 之Redis 集群
数据库·redis·nosql
2401_8371638910 小时前
CSS如何实现列表项序号自定义_利用--before与content实现
jvm·数据库·python
u01091476010 小时前
Go语言怎么做WASM_Go语言WebAssembly教程【对比】
jvm·数据库·python
pele10 小时前
HTML5中WebSocket构造函数及其初始化连接规范
jvm·数据库·python
衫水10 小时前
企业级 Text-to-SQL 完整执行流程
大数据·数据库·sql
m0_5150984210 小时前
如何创建哈希分区表_PARTITION BY HASH解决数据分布不均与热点块
jvm·数据库·python