我正在使用Realm来保存我的Android应用中的数据,并且让Realm崩溃了。情况:我在片段中使用RealmResults。有一个触发器可以切换到另一组数据,但尚未保存到Realm。所以我从文件中读取新内容,将其保存到Realm,然后重新运行我的查询以覆盖同一片段中的先前RealmResults。
io.realm.exceptions.RealmError: Unrecoverable error. Bad transaction log in /Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp line 210
at io.realm.internal.SharedRealm.nativeRefresh(Native Method)
at io.realm.internal.SharedRealm.refresh(SharedRealm.java:281)
at io.realm.HandlerController.realmChanged(HandlerController.java:450)
at io.realm.HandlerController.handleMessage(HandlerController.java:121)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6117)
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:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
我发现这个响应(https://github.com/realm/realm-java/issues/3702)以应对相同的崩溃,但我不理解响应的概念:
错误的事务日志可能以某种方式指示文件出现问题。 我看到你正在使用Sync。请注意,您无法在同步模式下打开旧Realm。您需要在那里移动所有数据。尝试将旧Realm打开为可同步将导致您看到的错误。
有人能指出我正确的方向吗? "以同步模式打开旧王国"意思?我是否需要在我的片段中关闭Realm并在覆盖我的RealmResults之前获取一个新的Realm实例?这是非常间歇性的,所以不是简单地尝试一次,看看是否能解决问题。
更新:最后通过不在MainActivity中打开任何Realm实例来修复。所以我必须在其ViewPager的一个片段中检查模式迁移。 (FWIW在片段的AsyncTask中调用beginTransaction()时发生崩溃,虽然我可以从我的错误记录中看到AsyncTask在崩溃后继续工作)。我认为这个问题与在片段的AsyncTask中使用Realm有关。我认为这是因为我有另一个带有ViewPager的Activity,但没有Realm的问题,我假设因为那些ViewPager片段不使用Realm + AsyncTask。
虽然我不再相信我的崩溃与尝试的架构迁移有关,但是我也是如此:
RealmConfiguration config = new RealmConfiguration.Builder()
.name("my_realm.realm")
.schemaVersion(MyConstants.MY_REALM_SCHEMA_VERSION)
.modules(new MyRealmModule())
.build();
try {
Realm.migrateRealm(config, new MigrationMyRealm());
System.out.println("debug tag, migrated realm");
} catch (FileNotFoundException e) {
System.out.println("debug tag, there is no realm to migrate");
} catch (IllegalStateException e) {
// realm is already open -- cannot migrate it
System.out.println("debug tag, could not migrate realm because it is open");
}