gpt4 book ai didi

java - 非法状态异常 : It's not allowed to delete the file associated with an open Realm

转载 作者:行者123 更新时间:2023-12-02 11:58:29 29 4
gpt4 key购买 nike

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

java.lang.IllegalStateException: It's not allowed to delete the file associated with an open Realm. Remember to close() all the instances of the Realm before deleting its file

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

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

最佳答案

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

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

因此,在调用deleteRealm()之前,请检查您是否在其他进程中使用了 Realm,以及这些进程是否未正确关闭。

关于java - 非法状态异常 : It's not allowed to delete the file associated with an open Realm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47432952/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com