非法状态异常:不允许删除与打开的领域关联的文件



当我调用real.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:

我试图返回Realm 3.0.0(我的上一个版本),但我没有这个IllegalStateException。我目前正在使用4.2.0。

也许我错过了Changelog中的东西..

在Realm-Java 4.1.0之前,Realm.deleteRealm()不是过程安全的调用。这意味着如果在其他过程中开设了领域实例,则不会投掷。但是在开放领域实例时删除将有很大的机会破坏数据库文件。

4.1.0Realm.deleteRealm()是多进程安全的API。如果它检测到在其他过程/线程上打开的领域实例,它将投掷。

因此,请检查您是否在另一个过程中使用领域,并且在调用deleteRealm()之前未正确关闭这些领域。

您可以使用

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);
        }
    }

我有这个主题的答案:https://github.com/realm/realm-java/issues/4552

如果您知道从版本N到版本n 1的迁移,则可以在需要时使用DynamicRealm检查版本和DeletereAlm。

主题中的更多详细信息。

在删除Realm Configuration之前添加以下行。

realm.close();

最新更新