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
}

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

GreenDao如何升级数据库_第1张图片

一共两个继承类,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来查看表中的数据

第一步将表导出:

GreenDao如何升级数据库_第2张图片

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

这里我就不演示了:

这是已有的数据

GreenDao如何升级数据库_第3张图片

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

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

GreenDao如何升级数据库_第4张图片

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

资源:

 

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

 

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

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(android的基础知识)