【问题标题】:realmconfiguration objecttype java领域配置对象类型 java
【发布时间】:2018-04-22 01:33:21
【问题描述】:

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

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

编辑:

好的,当我从 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) 

【问题讨论】:

    标签: java android kotlin realm


    【解决方案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
    

    【讨论】:

    • 啊,太好了,我也看到了这个答案。
    【解决方案2】:

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

    我怀疑您的问题是由其他原因引起的。应该有更详细的调试日志,其中包含“RealmMigrationNeededException”错误。它说什么?

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

    编辑:

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

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

    查看this answer 了解更多线索。

    【讨论】:

    • 在原帖中添加了细节
    猜你喜欢
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多