最近项目中用到了数据库,第三方库greenDAO对数据库操作的封装有特别好用,因此在项目中集成了greenDAO。但是当项目版本升级的时候,遇到了数据库升级的问题。经查greenDAO的源码,发现它对数据库升级的源码是将原有的数据库删除,重新建立新的数据库了。如果不想删除原有的数据,那么就涉及到数据库升级问题,数据库升级比较麻烦的就是数据的迁移问题
库文件下定义:
greendao {schemaVersion 1//指定数据库版本号,更新操作会用到;daoPackage '***'//自动生成的dao的包名,包名默认是entity所在的包;targetGenDir 'src/main/java'//生成数据库文件的目录 }创建数据库对象的实体类
@Entity
重新编译一下,会自动生成数据库使用的类
当对数据库实体类的参数变更时候
public class Helper extends DaoMaster.OpenHelper{private static DaoMaster daoMaster;private static DaoSession daoSession;public static final String DBNAME = "greendao.db";public Helper(Context context){super(context,DBNAME,null);}@Overridepublic void onUpgrade(Database db, int oldVersion, int newVersion) {super.onUpgrade(db, oldVersion, newVersion);Log.i("version", oldVersion + "---先前和更新之后的版本---" + newVersion);if (oldVersion < newVersion) {Log.i("version", oldVersion + "---先前和更新之后的版本---" + newVersion);MigrationHelper.getInstance().migrate(db, UserDao.class);//更改过的实体类(新增的不用加) 更新UserDao文件 可以添加多个 XXDao.class 文件 // MigrationHelper.getInstance().migrate(db, UserDao.class,XXDao.class); }}/*** 取得DaoMaster** @param context* @return*/public static DaoMaster getDaoMaster(Context context) {if (daoMaster == null) {DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(context,DBNAME, null);daoMaster = new DaoMaster(helper.getWritableDatabase());}return daoMaster;}/*** 取得DaoSession** @param context* @return*/public static DaoSession getDaoSession(Context context) {if (daoSession == null) {if (daoMaster == null) {daoMaster = getDaoMaster(context);}daoSession = daoMaster.newSession();}return daoSession;} }
完成相关操作之后;还要改数据库版本
greendao {schemaVersion 2//改版本号为2daoPackage 'com.zhangqie.greendao.gen';targetGenDir 'src/main/java' }
编译运行,可以去实体类和UserDao查看 增加的字段相关信息自动生成完成;
当然先前的版本1 中的数据也是存在的,只不过 新添加的字段 的值全部为空而已;
至此,数据库升级完成