【问题标题】:IllegalStateException: It's not allowed to delete the file associated with an open RealmIllegalStateException:不允许删除与打开的 Realm 关联的文件
【发布时间】:2018-05-06 02:07:43
【问题描述】:

当我调用 Realm.deleteRealm(config) 时出现异常:

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

我在 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。

也许我错过了更新日志中的某些内容..

【问题讨论】:

    标签: java android realm realm-migration


    【解决方案1】:

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

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

    所以在调用deleteRealm()之前,请检查您是否在其他进程中使用Realm并且没有正确关闭。

    【讨论】:

    【解决方案2】:

    你可以使用

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

    【讨论】:

    • 不,它不起作用=(我认为我的问题是当我重新启动应用程序以尝试迁移失败时。在应用程序中,我有实例打开但没有关闭,并且无法轻松关闭它们,代码太多复杂。当我重新启动应用程序以通过向模型添加字段来测试迁移异常时,可能有一些从以前的启动中打开的实例。
    • 在打开Realm之前可以试试吗? RealmConfiguration rc = Realm.getDefaultConfiguration(); if (rc != null) { Realm exRealm = Realm.getInstance(rc); exRealm.close(); }
    • 还是不行,我会尝试回到以前的版本来测试,我认为它没有像以前那样崩溃
    • 我试图回到领域 3.0.0(我以前的版本),但我没有这个 IllegalStateException。我目前正在使用 4.2.0。也许我错过了变更日志中的某些内容..
    【解决方案3】:

    我有一个关于这个话题的答案: https://github.com/realm/realm-java/issues/4552

    如果您知道从版本 N 迁移到版本 N+1 会抛出此 IllegalStateException,您可以使用 DynamicRealm 检查版本并在需要时删除Realm。

    主题中的更多细节。

    【讨论】:

      【解决方案4】:

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

      realm.close();
      

      【讨论】:

      • 像 dralexnumber 解决方案一样,紧追不舍?它不工作
      • @Lyofen 我使用的是 3.7.0 版本,它对我有用。用这个版本试一次
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多