无法迁移已打开~Realm~ Android的领域文件
我是Realm Android的新手,目前我需要在我的项目中使用Realm,但我经常遇到这样的问题:无法迁移已打开~Realm~ Android的领域文件,android,realm,Android,Realm,我是Realm Android的新手,目前我需要在我的项目中使用Realm,但我经常遇到这样的问题:无法迁移已打开的Realm文件错误,每当我打开应用程序时,这种错误就会经常发生 FATAL EXCEPTION: main Process: com.etobee.driver, PID: 31866 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.etobee.driver/com.etobee.dri
无法迁移已打开的Realm文件
错误,每当我打开应用程序时,这种错误就会经常发生
FATAL EXCEPTION: main
Process: com.etobee.driver, PID: 31866
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.etobee.driver/com.etobee.driver.activity.HomeActivity}: java.lang.IllegalStateException: Cannot migrate a Realm file that is already open: /data/data/com.etobee.driver/files/default6
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2460)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2522)
at android.app.ActivityThread.access$800(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5546)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:967)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
Caused by: java.lang.IllegalStateException: Cannot migrate a Realm file that is already open: /data/data/com.etobee.driver/files/default6
at io.realm.BaseRealm$3.onResult(BaseRealm.java:740)
at io.realm.RealmCache.invokeWithGlobalRefCount(RealmCache.java:274)
at io.realm.BaseRealm.migrateRealm(BaseRealm.java:735)
at io.realm.Realm.migrateRealm(Realm.java:1361)
at com.etobee.driver.util.RealMHelper.init(RealMHelper.java:35)
at com.etobee.driver.activity.DefaultActivity.onCreate(DefaultActivity.java:138)
at com.etobee.driver.activity.HomeActivity.onCreate(HomeActivity.java:91)
at android.app.Activity.performCreate(Activity.java:5975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2522)
at android.app.ActivityThread.access$800(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5546)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
下面是我初始化领域的方法,我在我的主要活动中称之为onCreate
public static void init(Context context){
// Create a RealmConfiguration that saves the Realm file in the app's "files" directory.
RealmConfiguration config0 = new RealmConfiguration.Builder(context)
.name("default6")
.schemaVersion(7)
.build();
try {
Realm.migrateRealm(config0, new RealmMigration() { /**--- ERROR HERE **/
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
// DynamicRealm exposes an editable schema
RealmSchema schema = realm.getSchema();
}
});
} catch (FileNotFoundException ignored) {
// If the Realm file doesn't exist, just ignore.
}
Realm.setDefaultConfiguration(config0);
}
问题是它并不总是发生,它是随机发生的,但却经常发生。我已经搜索了这个问题,但是没有找到任何东西。
请帮忙
先谢谢你
static RealmConfiguration realmConfiguration = null;
public static void init(Context context){
if(realmConfiguration == null) {
// Create a RealmConfiguration that saves the Realm file in the app's "files" directory.
realmConfiguration = new RealmConfiguration.Builder(context.getApplicationContext())
.name("default6")
.schemaVersion(7)
.migration(new MyMigration())
.build();
Realm.setDefaultConfiguration(realmConfiguration);
}
}
及
公共类MyMigration实现了RealMigration{
@凌驾
public void migrate(dynamicrelm领域、long oldVersion、long newVersion){
//dynamicrelm公开了一个可编辑的模式
RealmSchema schema=realm.getSchema();
//升级时,循环浏览每个版本。
对于(long version=oldVersion+1;version when isinit()
调用时?@EpicPandaForce它在我的main活动中的创建时在内部调用。我保证您将在旋转时崩溃,然后使用上面的代码:O,特别是如果您在onDestroy()
中未调用close()
添加此额外的catch语句:catch(IllegalStateException e){}。不过,理想情况下,您需要找到打开的领域并关闭它。循环用于什么?将领域从以前的版本迁移到特定版本
public class MyMigration implements RealmMigration {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
// DynamicRealm exposes an editable schema
RealmSchema schema = realm.getSchema();
// Loop through each version when an upgrade occurs.
for (long version = oldVersion + 1; version <= newVersion; version++) {
switch (version) {
case 1:
// migrate to version 1
break;
case 2:
// migrate to version 2
break;
//...
case 7:
// migrate to version 7
break;
}
}
}
@Override
public int hashCode() {
return MyMigration.class.hashCode();
}
@Override
public boolean equals(Object obj) {
return obj != null && obj instanceof MyMigration;
}
}