时间仓促,有错误请指出,会及时改正,多谢多谢。
本人用的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" }
}
}
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中即可。