首先,這玩意怎么升級數據庫?
- 傳統SQLite語句做法:
寫一個自己的Helper繼承自SQLiteOpenHelper,重寫里面的onUpgrade方法,方法里做的事情就是(如圖):
- 先把原先的表drop下來,就是刪了
-
然后再重新創建
-
GreenDao:
問題:greendao里面沒有那種指定版本號就升級的方法,摸索之后如下:
在這里更改數據庫版本,然后點擊make project,下次安裝的時候就升級了~
然而,默認情況下GreenDao升級數據庫也是會直接drop掉table,那樣數據就全部清空了!!!
- 解決方法如下:
借鑒github上面一個開源項目:GreenDaoUpgradeHelper
按照作者的思路走就很簡單了,以下是實踐起來的步驟:
1.在根目錄的build.gradle文件的repositories內添加如下代碼:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
2.添加依賴(greendao 3.0及以上)
dependencies {
compile 'org.greenrobot:greendao:3.2.0'
compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.0.0'
}
- 自己建一個Helper類繼承OpenHelper:
public class MyDataBaseHelper extends DaoMaster.OpenHelper {
public MyDataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
//這里重寫onUpgrade方法
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
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);
}
//注意此處的參數StudentDao.class,很重要(一開始沒注意,給坑了一下),它就是需要升級的table的Dao,
//不填的話數據丟失,
// 這里可以放多個Dao.class,也就是可以做到很多table的安全升級,Good~
}, StudentDao.class);
}
}
- 記得這里的OpenHelper要用剛才自己寫的那個。
大功告成,然后每次要升級就去改gradle的schemaVersion就是了。
穩了穩了~~