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

GreenDao - Android - OnUpgrade not being called (Encrypted Database)

我正在为我的数据库使用 GreenDao 3.2.2

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

现在我正在将 gradle 模式编辑到更高版本,因为我向 table 添加了一些道具:

greendao {
    schemaVersion 4
}

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

申请class

//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 class

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
    }
}

我是不是漏了什么?

知道了!!!经过几个小时的搜索和阅读 GreenDAO 代码,我明白了这个问题。

问题是 getEncryptedWritableDb 创建了另一种不扩展 SQLiteDatabase 的数据库。所以即使EncryptedHelper拿到了onUpgrade方法,我的帮手class也没有抓到,因为掉进了另一个签名

解决方案是简单地使用接收 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