下面开始升级的介绍,首先贴出热心大神封装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);
}