Android GreenDao使用(三)数据库升级

时间仓促,有错误请指出,会及时改正,多谢多谢。


本人用的greendao版本是3.2.2。


前两篇介绍了greendao的基本用法,今天写篇数据库升级的。

前两篇地址贴出来:

GreenDao(一)创建数据库

GreenDao(二)增删改查


下面开始升级的介绍,首先贴出热心大神封装greendao数据库升级的开源地址,再次感谢这些牛逼的巨人们宽大的肩膀。

点这里


greendao的数据库那些dao文件或者是bean文件都是我们自己新建的java工程生成的,这个在上篇博客讲了。

我们要升级数据库,说明我们的表有字段变了,或者增加了表,或者删除了表。

我们的数据库版本是在greendao生成文件时的那个java类中指定的,例:

// 生成数据库实体类xxentity 对应的是数据库的表
        Schema schema = new Schema(100, "com.school.entity");

上面是第一个要注意的点,如果你忘了增加数据库的版本号,升级应用的时候会出问题。


接下来就是倒入上面大神的依赖了:

在project的gradle中:

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

然后在app目录下的gradle中倒入:

compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.4.0'

上面这个是greendao 3.0以上版本的,下面是3.0以前版本对应的jar:

compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.0.1'


接下来就是使用了,上篇博客中介绍了,封装了一个数据库操作类,叫DaoManager,这次稍作修改,下面再次贴出这个类所有代码。

注:变化的只是44行的getDaoMaster方法。

public class DaoManager {

    private static final String TAG = DaoManager.class.getSimpleName();

    // 数据库名称
    private static final String DB_NAME = "reliable.sqlite";

    // 多线程访问
    private volatile static DaoManager manager;

    private static DaoMaster.DevOpenHelper helper;

    private static DaoMaster daoMaster;

    private static DaoSession daoSession;

    private Context context;

    /**
     * 使用单例模式获得操作数据库的对象
     */
    public static DaoManager getInstance(){
        DaoManager instance = null;
        if (manager == null){
            synchronized (DaoManager.class){
                if (instance == null){
                    instance = new DaoManager();
                    manager = instance;
                }
            }
        }
        return manager;
    }

    public void init(Context context){
        this.context = context;
    }

    /**
     * 判断是否存在数据库
     * 如果没有则创建数据库
     */
    public DaoMaster getDaoMaster(){
        if (daoMaster == null){
//            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
            MyOpenHelper myOpenHelper = new MyOpenHelper(context, DB_NAME, null);
            daoMaster = new DaoMaster(myOpenHelper.getWritableDatabase());
        }
        return daoMaster;
    }

    /**
     * 完成对数据库的添加删除修改查询等的操作
     * 注:仅仅是一个接口
     */
    public DaoSession getDaoSession(){
        if (daoSession == null){
            if (daoMaster == null){
                daoMaster = getDaoMaster();
            }
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }

    /**
     * 打开输出日志的操作
     * 注:默认是关闭的
     */
    public void setDebug(){
        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;
    }

    /**
     * 关闭所有的操作
     * 注:数据库开启之后,使用完毕必须要关闭
     */
    public void closeConnection(){
        closeHelper();
        closeDaoSession();
    }
    public void closeHelper(){
        if (helper != null){
            helper.close();
            helper = null;
        }
    }
    public void closeDaoSession(){
        if (daoSession != null){
            daoSession.clear();
            daoSession = null;
        }

    }

}




上面的DaoManager的类中变化的只有方法getDaoMaster();

将原来的DaoMaster的DevOpenHelper换成自己定义的GawOpenHelper。

下面贴出GawOpenHelper类:

public class GawOpenHelper extends DaoMaster.DevOpenHelper {

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

    @Override
    public void onUpgrade(SQLiteDatabase db, int currentVersion, int lastestVersion) {
        MigrationHelper.migrate(db, SchoolsDao.class, FuckerDao.class, NewDao.class, NewNewDao.class);
    }
}


就一行。。。。。

将你的dao类直接扔到MigrationHelper中即可。






你可能感兴趣的:(Android)