GreenDao如何升级数据库

GreenDao在数据升级的时候会采用,先把本地已有的表和数据删除再重新再建一张新的表,这样会导致用户之前缓存的数据给清空了,带来不太好的影响。

如何解决呢?

第一步查看源码?GreenDao更新数据库,是不是重新建表了:

写一个MyOpenHelper类继承DaoMaster.OpenHelper

public class MyOpenHelper extends DaoMaster.OpenHelper {
    public MyOpenHelper(Context context, String name) {
        super(context, name);
    }

    public MyOpenHelper(Context context, String name,
            SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    @Override public void onUpgrade(Database db, int oldVersion, int newVersion) {
        super.onUpgrade(db, oldVersion, newVersion);
        Log.e("Tag", "table ==>onUpgrade");
       
    }
在数据库升级的时候,会走onUpgrade 方法,点击进去
/**
 * Override this if you do not want to depend on {@link SQLiteDatabase}.
 */
public void onUpgrade(Database db, int oldVersion, int newVersion) {
    // Do nothing by default
}

发现没做什么,看她的继承类

一共两个继承类,DevOpenHelper 和MyOpenHelper,前面一个是系统给我们提供的,后面一个是上面我们继承的,我们看系统是如何处理更新的

    @Override
        public void onUpgrade(Database db, int oldVersion, int newVersion) {
            Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
            dropAllTables(db, true);
            onCreate(db);
        }

上面是系统处理 onUpgrade的方法调用了两个方法

dropAllTables(db,true)  这个方法就是删除已有的表中的信息,有兴趣的同学可以进去看下

onCreate方法就是重新建表

如何解决问题:

我们为了避免不删除库中原有的信息,所以我们不需要系统提供的,我们需要重新上面的方法,这就是为什么要写一个MyOpenHelper类继承DaoMaster.OpenHelper重写onUpgrade()方法

public class MyOpenHelper extends DaoMaster.OpenHelper {
    public MyOpenHelper(Context context, String name) {
        super(context, name);
    }

    public MyOpenHelper(Context context, String name,
            SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    @Override public void onUpgrade(Database db, int oldVersion, int newVersion) {
        super.onUpgrade(db, oldVersion, newVersion);
        Log.e("Tag", "table ==>onUpgrade");
        //进行数据库的迁移
        if (newVersion > oldVersion) {    //这里有需要更细的同学可以根据不同的oldVersion处理不同的逻辑
            DBMigrationHelper.getInstance().migrate(db, RoutBeanDao.class);
        }
    }

上面DBMigrationHelper类的作用是,创建一张和oldVersion一样的临时表,将数据copy过去,再创建新表后将数据复制给新表,DBMigrationHelper再文末会给大家

验证可行性:

现在我本地建了一张表,我们先用SQLiteStudio来查看表中的数据

第一步将表导出:

在data /data /包名/数据库名/导出

这里我就不演示了:

这是已有的数据

现在我们添加一个 TEST_ID这个字段

发现数据还在,TEST_ID 添加上了

其他还有很多,删除字段等,大家有时间可以自己测试下

资源:

 

https://download.csdn.net/download/xueyoubangbang/11179284          //查看数据库的下载

 

https://download.csdn.net/download/xueyoubangbang/11179276         //DBMigrationHelper的下载

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值