realmconfiguration objecttype java

时间:2018-04-22 01:33:22

标签: java android kotlin realm

在创建RealmConfiguration时,是否存在与Swift中的objectTypes参数等效的Java?https://realm.io/docs/swift/latest/api/Classes/Realm/Configuration.html

移植使用多个Realm数据存储的IOS应用程序将只读应用程序数据与读/写用户数据分开,因此我需要指定哪些模型属于哪个域以避免RealmMigrationNeededException,当realm可以&# 39;在第一个领域找到一个实际属于第二个领域的模型。

编辑:

好的,当我从RealmObject扩展一个新模型(TLGalleryItem)时,会出现以下异常,该模型将保存在第二个领域实例中。如果删除对模型的所有引用并从模型异常中移除RealmObject的继承就会消失。一旦我从RealmObject扩展模型(在代码中仍然没有引用它),我得到了这个:

04-23 08:43:35.603 26777-26777/com.(my project name).android.(my project name) E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.(my project name).android.(my project name), PID: 26777
    java.lang.ExceptionInInitializerError
        at com.(my project name).android.(my project name).activities.insightFinder.ThemesActivity.<init>(ThemesActivity.kt:23)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1173)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2708)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: io.realm.exceptions.RealmMigrationNeededException: Cannot open the read only Realm. 'TLGalleryItem' is missing.
        at io.realm.Realm.<init>(Realm.java:179)
        at io.realm.Realm.createInstance(Realm.java:435)
        at io.realm.RealmCache.doCreateRealmOrGetFromCache(RealmCache.java:342)
        at io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:282)
        at io.realm.Realm.getInstance(Realm.java:364)
        at com.(my project name).android.(my project name).data.DBService.<clinit>(DBService.kt:21)
        at com.(my project name).android.(my project name).activities.insightFinder.ThemesActivity.<init>(ThemesActivity.kt:23) 
        at java.lang.Class.newInstance(Native Method) 
        at android.app.Instrumentation.newActivity(Instrumentation.java:1173) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2708) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

2 个答案:

答案 0 :(得分:1)

我无法在Android上说明如何操作,但通常不需要在iOS中设置Realm配置的objectTypes。我个人使用它,如果我有两个或更多的Realm配置,作为更安全的编码实践。如果我不小心调用了错误的Realm配置,它没有包含我想要的对象,而不是没有得到任何结果,我从Realm获得了一个有用的调试消息:&#34;对象类型xxxxx不是由Realm管理的。 #34;

我怀疑你的问题是由别的东西引起的。应该有一个更详细的调试日志,其中包含&#39; RealmMigrationNeededException&#39;错误。这是什么意思?

请记住,在开发过程中,如果您更改了Realm模型(并且没有为此设置迁移),则需要在构建和再次运行之前以某种方式删除Realm。在iOS上,我们从设备或模拟器中删除应用程序。

修改

有趣的发现。我明白你为什么要考虑objectTypes路线。理智检查:

  • 您是否在调用Realm之前设置了配置? Realm.setDefaultConfiguration()不是线程安全的。
  • 使用正确的配置调用Realm。

请查看Download maven以获取更多线索。

答案 1 :(得分:1)

这回答了我的问题: https://stackoverflow.com/a/46609808/8902232

相关信息是:在RealmConfiguration中使用modules(...)。对我来说,Kotlin看起来像:

private val shippedRealmConfig = RealmConfiguration.Builder()
            .name(Realm.DEFAULT_REALM_NAME)
            .assetFile("shippedData.realm")
            .schemaVersion(1)
            .modules(ShippedModule())
            .readOnly()
            .build()

private val shippedRealm = Realm.getInstance(shippedRealmConfig)

@RealmModule(classes = arrayOf(TLTheme::class, TLSymptom::class, TLUnhelpfulBelief::class, TLInsight::class))
private class ShippedModule