代码之家  ›  专栏  ›  技术社区  ›  Scott Nightingale

realmconfiguration对象类型java

  •  1
  • Scott Nightingale  · 技术社区  · 6 年前

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

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

    编辑:

    好的,当我从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 回复  |  直到 6 年前
        1
  •  1
  •   Scott Nightingale    6 年前

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

    相关信息是:使用模块(…)在RealmConfiguration中。对我来说,在科特林这看起来像:

    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
  •  1
  •   MattyG    6 年前

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

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

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

    编辑:

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

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

    看看 this answer 寻找更多线索。