在App更新的過程中,不免需要升級數(shù)據(jù)庫,重建或修改表結構,但是GreenDao并沒有提供相應的數(shù)據(jù)庫升級方法,觀察GreenDao生成的DaoMaster類,可以找到解決辦法。
GreenDao中數(shù)據(jù)庫版本不可修改,在編譯生成的DaoMaster類中,可以看到,SCHEMA_VERSION固定為1。
public class DaoMaster extends AbstractDaoMaster {
public static final int SCHEMA_VERSION = 1;
...
public static abstract class OpenHelper extends DatabaseOpenHelper {
public OpenHelper(Context context, String name) {
super(context, name, SCHEMA_VERSION);
}
public OpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory, SCHEMA_VERSION);
}
@Override
public void onCreate(Database db) {
Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
createAllTables(db, false);
}
}
public static class DevOpenHelper extends OpenHelper {
public DevOpenHelper(Context context, String name) {
super(context, name);
}
public DevOpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
dropAllTables(db, true);
onCreate(db);
}
}
}
一般GreenDao初始化為:
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, ENCRYPTED ? "fpc-db-encrypted" : "fpc-db");
db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
如果使用自帶的DevOpenHelper,那么生成的數(shù)據(jù)庫版本固定為SCHEMA_VERSION = 1,數(shù)據(jù)庫永遠不會升級。
要想升級數(shù)據(jù)庫版本從而觸發(fā)onUpgrade方法,需要自定義一個OpenHelper,繼承org.greenrobot.greendao.database.DatabaseOpenHelper,代碼如下:
...
import org.greenrobot.greendao.database.DatabaseOpenHelper;
public class GreenOpenHelper extends DatabaseOpenHelper {
public static int DB_VERSION = BuildConfig.VERSION_CODE;
public GreenOpenHelper(Context context, String name) {
super(context, name, DB_VERSION);
}
public GreenOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory, DB_VERSION);
}
@Override
public void onCreate(Database db) {
Log.i("greenDAO", "Creating tables for schema version " + DB_VERSION);
DaoMaster.createAllTables(db, false);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
if (newVersion > oldVersion) {
DaoMaster.dropAllTables(db, true);
onCreate(db);
}
}
}
注意, DatabaseOpenHelper繼承android.database.sqlite.SQLiteOpenHelper,需要將數(shù)據(jù)庫版本寫入SQLiteOpenHelper的構造器才能生效
我們使用GreenOpenHelper替代DaoMaster.DevOpenHelper,初始化代碼現(xiàn)在變?yōu)?
GreenOpenHelper helper = new GreenOpenHelper(this, ENCRYPTED ? "fpc-db-encrypted" : "fpc-db");
db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
現(xiàn)在我們可以用BuildConfig.VERSION_CODE來控制數(shù)據(jù)庫版本,需要升級數(shù)據(jù)庫時在build.gradle(app模塊)修改versionCode就可以了。