已部署的发布模式apk首次安装 - 必须提供RealmMigration

时间:2017-01-29 23:17:09

标签: android android-studio apk realm

我得到例外"必须提供RealmMigration"在Android手机上首次运行部署的应用程序(通过&#34放置在设备上; adb install app-release.apk"

它在主要活动的onCreate中经历的代码如下:

Realm.init(context);
realm = Realm.getDefaultInstance();

对getDefaultInstance()的调用发生异常。这仅在签名版本的apk中发生。 如果我清除所有存储数据并卸载应用程序,然后重新部署,它将始终发生。

清除存储数据但不卸载后,它就会停止发生。

如果我清除所有存储数据并卸载然后通过android studio调试应用程序,则不会发生。

是什么导致这种情况?

谢谢, 麦克

2 个答案:

答案 0 :(得分:3)

这是因为您未在应用程序 onCreate()方法中设置默认架构配置。您可以使用schema builder创建架构:

// The Realm file will be located in Context.getFilesDir() with name "default.realm"
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder().build();
Realm.setDefaultConfiguration(config);  

但请注意,仅当您的对象模型未更改时才使用此方法。您有两种运行应用程序的变体" unstable"对象模型:

开发:

您可以使用deleteRealmIfMigrationNeeded()方法在开发阶段构建领域shema而无需迁移:

Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
    .deleteRealmIfMigrationNeeded().build();
Realm.setDefaultConfiguration(config); 

在这种情况下,如果对象模型有任何更改,数据库将自动删除并重新创建。

用于生产

如果您想保留数据,则需要编写迁移脚本。在这种情况下,您需要使用架构版本构建数据库架构并手动管理此版本,如下例所示:

Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
    .schemaVersion(2) // Must be bumped when the schema changes
    .migration(new MyMigration()) // Migration to run instead of throwing an exception
    .build();
Realm.setDefaultConfiguration(config);  

在此documentation chaptersample application

中详细了解迁移规则

答案 1 :(得分:1)

我找到了罪魁祸首。进入手机"设置|一般|备份&重置|自动恢复"。那是在。所以"重新安装应用程序时,恢复备份的设置和数据"。在我的应用程序重新开始之前,旧版本的数据库将会恢复!可爱的COW恼人! :)

非常感谢你的帮助 - 非常感谢,但这是真正的问题!干杯!