GreenDao3數(shù)據(jù)庫升級

在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就可以了。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容