我的应用不断报告某些崩溃,尤其是在我们发布新的Realm Scheme时,由于以下错误:
io.realm.exceptions.RealmMigrationNeededException: Migration is required due to the following errors:
Class 'XXX' has been added , ...
即使我们设置了迁移,也会抛出这些错误,并且对于99%的用户,迁移执行得很好。
经过全面测试后,我注意到该错误是因为加密密钥变得无效(至今仍为原因),所以从未设置我的默认初始配置,所以从未分配MigrationHelper:
Realm.init(context);
final RealmKeyProvider keyProvider = new RealmKeyProvider(context);
final byte[] symmetricKey = keyProvider.getSecretKey();
if (symmetricKey != null && symmetricKey.length == 64) { //this returns empty key
RealmConfiguration sRealmConfiguration = new RealmConfiguration.Builder()
.name(REALM_NAME)
.schemaVersion(REALM_SCHEMA_VERSION)
.migration(new MigrationHelper())
.encryptionKey(symmetricEarmark)
.build();
Realm.setDefaultConfiguration(sRealmConfiguration);
}
我已经开发出一种解决方法,可以在发生这种情况时还原Realm,以便使应用可以从干净状态重新启动。
但是,我很好奇,如果没有提供用于解密现有数据库的密钥,Realm如何知道需要迁移?方案未加密吗?