6.1 数据库升级

1.背景

在版本迭代时,有时候需要对数据库进行升级,而GreenDAO默认的DaoMaster.DevOpenHelper在进行数据升级时,会把旧表删除,然后创建新表,并没有迁移旧数据到新表中,从而造成数据丢失。 这在实际中是不可取的,因此我们需要作出调整。下面介绍数据库升级的步骤与要点。

2.操作步骤

  • 1 复制MigrationHelper到项目,网上有不少MigrationHelper的源码,这里采用的是https://github.com/yuweiguocn/GreenDaoUpgradeHelper中的MigrationHelper,它主要是通过创建一个临时表,将旧表的数据迁移到新表中,大家可以去看下源码。

  • 2 新建一个类,继承DaoMaster.OpenHelper ,重写onUpgrade(Database db, int oldVersion, int newVersion)方法,在该方法中使用MigrationHelper进行数据库升级以及数据迁移。

 public class MyOpenHelper extends DaoMaster.OpenHelper {
    public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }
    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        //把需要管理的数据库表DAO作为最后一个参数传入到方法中
        MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
            @Override
            public void onCreateAllTables(Database db, boolean ifNotExists) {
                DaoMaster.createAllTables(db, ifNotExists);
            }
            @Override
            public void onDropAllTables(Database db, boolean ifExists) {
                DaoMaster.dropAllTables(db, ifExists);
            }
        },  BeanDao.class); // 修改beanDao对象
    }
}
  1. 然后使用MyOpenHelper替代DaoMaster.OpenHelper来进行创建数据库等操作
//建库
mSQLiteOpenHelper = new MyOpenHelper(MyApplication.getInstance(), DB_NAME);

mDaoMaster = new DaoMaster(mSQLiteOpenHelper.getWritableDatabase());
mDaoSession = mDaoMaster.newSession();
  • 4 修改实体对象的字段
@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;
    private String name;
    private String content;
    private String money; //添加的字段
  • 5 编译—重要

  • 6 修改Module下build.gradle中数据库的版本号schemaVersion ,递增加1即可,最后运行app

greendao {
    //数据库版本号,升级时进行修改
    schemaVersion 2
    daoPackage 'com.dev.base.model.db'
    targetGenDir 'src/main/java'
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章