IllegalStateException:不允许删除与打开的Realm

时间:2017-11-22 10:57:58

标签: java android realm realm-migration

当我打电话给Realm.deleteRealm(config)时我有一个例外:

  

java.lang.IllegalStateException:不允许删除该文件   与开放的领域相关联。记得关闭()所有实例   在删除其文件之前的领域

我在Application.onCreate中的Realm.init()之后调用它,所以没有理由打开其他实例。

public void onCreate() {
    Realm.init(this);

    Realm realm;
    RealmConfiguration config = getConfig();
    try {
        realm = Realm.getInstance(config); // Will migrate if needed
    } 
    catch (RealmMigrationNeededException e) 
    {
        Realm.deleteRealm(config);
        realm = Realm.getInstance(config);
    }
}

我看到了这些主题,但无法看到解决方案:

https://github.com/realm/realm-java/issues/4552

https://github.com/realm/realm-java/issues/5416

修改

我认为我的问题是当我重新启动应用程序以尝试失败迁移时。在应用程序中,我打开但未关闭的实例,并且无法轻松关闭它们,代码太复杂了。当我重新启动应用程序来测试迁移异常并向模型添加字段时,可能会在上次启动时打开一些实例。

编辑2:

我试图回到领域3.0.0(我以前的版本),我没有这个IllegalStateException。我目前正在使用4.2.0。

也许我错过了更改日志中的内容..

3 个答案:

答案 0 :(得分:0)

您可以使用

public void onCreate() {
    Realm.init(this);

    Realm realm;
    RealmConfiguration config = getConfig();
    try {
        realm = Realm.getInstance(config); // Will migrate if needed
    } 
    catch (RealmMigrationNeededException e) 
    {
        realm.close();
        Realm.deleteRealm(config);
        realm = Realm.getInstance(config);
    }
}

而不是

public void onCreate() {
        Realm.init(this);

        Realm realm;
        RealmConfiguration config = getConfig();
        try {
            realm = Realm.getInstance(config); // Will migrate if needed
        } 
        catch (RealmMigrationNeededException e) 
        {
            Realm.deleteRealm(config);
            realm = Realm.getInstance(config);
        }
    }

答案 1 :(得分:0)

我从这个主题得到了答案: https://github.com/realm/realm-java/issues/4552

如果您知道从版本N迁移到版本N + 1会抛出此IllegalStateException,则可以根据需要使用DynamicRealm检查版本和deleteRealm。

主题中的更多详细信息。

答案 2 :(得分:0)

在删除领域配置之前添加以下行。

realm.close();