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對象
}
}
- 然後使用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'
}