美文网首页
Greendao-增量更新

Greendao-增量更新

作者: XII01 | 来源:发表于2020-04-13 09:56 被阅读0次

    在上一篇后,我们的已经完美使用了数据库,我们的数据库也有了数据,但是问题来了新问题,我们在原来的表增加字段,怎么更新呢?
    入门篇-GreenDao-初探

     greendao {
            schemaVersion 1 //数据库版本号,更新跟这里有关
            targetGenDir 'src/main/java'
            daoPackage '包名.greendao'
        }
    

    GreenDao默认帮我们处理来升级操作,只需要修改一下schemaVersion版本号(注意这里只能填写比之前大的数,不可以小);
    以为完美解决了,我们可以愉快的写代码了,运行代码一看,以前的数据去哪里了(有小动物跑过)
    通过查看daoPackage 下面的DaoMaster.DevOpenHelper源码发现

        public static class DevOpenHelper extends OpenHelper {
            public DevOpenHelper(Context context, String name) {
                super(context, name);
            }
    
            public DevOpenHelper(Context context, String name, CursorFactory factory) {
                super(context, name, factory);
            }
    
            @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);
            }
        }
    

    发现每次升级都是把老的数据库删除掉,包括数据,然后再重新创建相关的数据库和表,这样就导致了数据库升级之后数据的丢失.那怎样才能做到不删除老数据呢?

    下面轮到主角出场了,MigrationHelper

    public class MyDbHelper extends DaoMaster.OpenHelper {
    
        public MyDbHelper (Context context, String name) {
            this(context, name, null);
        }
    
        public MyDbHelper (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);
      
            if (oldVersion < newVersion) {
                //处理需要更新的表
                Class[] classes = null;
                if (classes != null) {
                    MigrationHelper.migrate(db, classes);
                }
            }
        }
    
    
    }
    

    如上代码,我们自己继承自 DaoMaster.OpenHelper,调用自己的升级方法,通过oldVersion < newVersion去更新需要更新的表,注意点看代码。
    这里遇到过一个大坑,在这里分享一下,就是开发了几个版本没有发版,导致老版本更新的时候,中间的版本没有更新到位,如果你也遇到这样的问题,将更新的表放到最后一个即可,我这里的做法是一个循环去更新,如果你有更好的发现,请分享一下,共同进步.
    下一篇数据库加密相关

    相关文章

      网友评论

          本文标题:Greendao-增量更新

          本文链接:https://www.haomeiwen.com/subject/limwmhtx.html