GreenDao - Android - 未调用OnUpgrade(加密数据库)

时间:2017-06-14 19:17:05

标签: android android-sqlite upgrade database-migration greendao

我使用 GreenDao 3.2.2 作为我的数据库,

在我第一次通过@tags创建实体时,一切正常。

现在我正在将gradle架构编辑为更高版本,因为我在表中添加了一些道具:

greendao {
    schemaVersion 4
}

但是从不调用OpenHelper onUpgrade方法,因此我的项目总是崩溃,因为找不到某些列。

申请类

//Init DB
        UpgradeHelper helper = new UpgradeHelper(this, ENCRYPTED ? "db-encrypted" : "db", null);
        Database db = ENCRYPTED ? helper.getEncryptedWritableDb("app-cipher") : helper.getWritableDb();
        daoSession = new DaoMaster(db).newSession();

OpenHelper类

public class UpgradeHelper extends DaoMaster.OpenHelper {

    public UpgradeHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

       //never gets called
        Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion);

        //do migrations
    }
}
我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

得到了!!!经过几个小时的搜索和阅读GreenDAO代码,我理解了这个问题。

问题在于getEncryptedWritableDb创建了另一种不扩展SQLiteDatabase的数据库。因此,即使EncryptedHelper获取onUpgrade方法,我的帮助程序类也没有捕获它,因为它落入了另一个签名。

解决方案只是使用另一个接收DAO Database接口的签名:

 public void onUpgrade(Database db, int oldVersion, int newVersion) {
        Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by migrating all tables data");

        //do migration

    }

当然我需要更新所有迁移方法以接收Database对象而不是StandardDatabase