GreenDao教程(4):数据库升级

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

点这里

 

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

 

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

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

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

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

在project的gradle中:

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

greendao是3.0以前的版本

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

greendao 3.0及以上

compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.1.0'

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

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

public class DaoManager {

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

    // 数据库名称
    private static final String DB_NAME = "zhangLei.db";

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

    private static DaoMaster.DevOpenHelper helper;

    private static DaoMaster daoMaster;

    private static DaoSession daoSession;

    private Context context;

    /**
     * 使用单例模式获得操作数据库的对象
     */
    public static DaoManager getInstance() {
        if (manager == null) {
            synchronized (DaoManager.class) {
                if (manager == null) {
                    manager = new DaoManager();
                }
            }
        }
        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);
            GawOpenHelper myOpenHelper = new GawOpenHelper(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, StudentDao.class, TeacherDao.class, CourseDao.class);
    }
}

就一行。。。。。

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

混淆配置:

-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
    public static void dropTable(org.greenrobot.greendao.database.Database, boolean);
    public static void createTable(org.greenrobot.greendao.database.Database, boolean);
}

 

上一篇:GreenDao教程(3):一对一,一对多,多对多

 

转自:https://blog.csdn.net/geanwen/article/details/72842908

你可能感兴趣的:(移动开发)