在上一篇后,我们的已经完美使用了数据库,我们的数据库也有了数据,但是问题来了新问题,我们在原来的表增加字段,怎么更新呢?
入门篇-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去更新需要更新的表,注意点看代码。
这里遇到过一个大坑,在这里分享一下,就是开发了几个版本没有发版,导致老版本更新的时候,中间的版本没有更新到位,如果你也遇到这样的问题,将更新的表放到最后一个即可,我这里的做法是一个循环去更新,如果你有更好的发现,请分享一下,共同进步.
下一篇数据库加密相关
网友评论