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
我正在为我的数据库使用 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