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'
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章