Java 非法国家例外:它';不允许删除与开放域关联的文件

Java 非法国家例外:它';不允许删除与开放域关联的文件,java,android,realm,realm-migration,Java,Android,Realm,Realm Migration,调用Realm.deleteRealm(配置)时出现异常: java.lang.IllegalStateException:不允许删除该文件 与开放领域相关的。记住关闭()所有实例 在删除其文件之前删除域的 我在Application.onCreate中的Realm.init()之后调用它,所以没有理由打开其他实例 public void onCreate() { Realm.init(this); Realm realm; RealmConfiguration con

调用Realm.deleteRealm(配置)时出现异常:

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);
    }
}
我看到了这些主题,但看不到解决方案:

编辑:

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

编辑2:

我试图回到3.0.0领域(我以前的版本),但我没有这个非法的例外。我目前正在使用4.2.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);
        }
    }

我有一个关于这个话题的答案:

如果您知道从版本N迁移到版本N+1会引发这个非法状态异常,那么您可以使用DynamicRealm检查版本,如果需要,还可以使用deleteRealm


有关详细信息,请参阅主题。

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

realm.close();

在RealmJava
4.1.0
之前,
realm.deleteRealm()
不是进程安全调用。这意味着如果在其他进程中打开了领域实例,它不会抛出。但是在打开领域实例时删除将有很大的机会损坏数据库文件

4.1.0
Realm.deleteRealm()
是一个多进程安全API。如果检测到在其他进程/线程上打开了领域实例,它将抛出


因此,在调用
deleteRealm()
之前,请检查您是否在另一个进程中使用了Realm,并且这些进程没有正确关闭=(我想我的问题是当我重新启动应用程序尝试失败迁移时。在应用程序中,我打开了实例,但没有关闭,并且无法轻松关闭它们,代码太复杂。当我重新启动应用程序,通过向模型添加字段来测试迁移异常时,可能有一些实例是从上一次启动时打开的。您能在之前尝试吗e打开领域?
RealmConfiguration rc=Realm.getDefaultConfiguration();if(rc!=null){Realm exRealm=Realm.getInstance(rc);exRealm.close();}
仍然无法工作,我将尝试返回到以前的版本进行测试,我认为在我尝试返回到realm 3.0.0(我以前的版本)之前,它并没有像那样崩溃,我没有这个非法状态例外。我目前正在使用4.2.0。也许我在changelog中遗漏了一些东西。比如dralexnumber解决方案,close in catch?不是working@Lyofen我正在使用3.7.0版本,它对我有效。请尝试使用此版本。thx@Beender,您在github上回答了我,我忘记关闭此堆栈。