当我调用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.0
,Realm.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();