Java 非法国家例外:它';不允许删除与开放域关联的文件
调用Realm.deleteRealm(配置)时出现异常: java.lang.IllegalStateException:不允许删除该文件 与开放领域相关的。记住关闭()所有实例 在删除其文件之前删除域的 我在Application.onCreate中的Realm.init()之后调用它,所以没有理由打开其他实例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
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上回答了我,我忘记关闭此堆栈。