RealmObject 的 Kotlin 数据类

Posted

技术标签:

【中文标题】RealmObject 的 Kotlin 数据类【英文标题】:Kotlin data class of RealmObject 【发布时间】:2016-03-25 21:58:35 【问题描述】:

我正在使用 Kotlin 和 Realm 编写一个数据类

data class AuthToken(val register: Boolean,
                     val token: String,
                     val tokenSecret: String,
                     val user: AuthUser)

我必须将数据保存到 db,所以我使用 Realm 来保存它。但正如我们所知,如果我想将类保存到 Realm,AuthToken 类必须扩展 RealmObject

这就是问题所在,Kotlin 说数据类不能扩展类。 所以我放弃了数据类,只使用一个普通的 Kotlin 类作为模型,那么另一个问题来了:

Kotlin 类没有 getter 或 setter。正如我们所知,Realm 类必须将所有属性设置为私有并编写 getter 和 setter。

现在我想知道如何解决这个问题。

【问题讨论】:

我在使用 SugarORM 时也遇到过这个问题......Jetbrains 已经要求提供反馈......不过,您可以在这篇文章中发表评论:blog.jetbrains.com/kotlin/2015/09/… 【参考方案1】:

Realm 目前不支持 Data 类。您可以在此处查看如何在 Kotlin 中编写 Realm 兼容模型类的示例:https://github.com/realm/realm-java/tree/master/examples/kotlinExample/src/main/kotlin/io/realm/examples/kotlin/model

public open class Person(
        @PrimaryKey public open var name: String = "",
        public open var age: Int = 0,
        public open var dog: Dog? = null,
        public open var cats: RealmList<Cat> = RealmList(),
        @Ignore public open var tempReference: Int = 0,
        public open var id: Long = 0
) : RealmObject() 

【讨论】:

我们有这方面的最新消息吗?在 Realm 3.0.0 中,我看到仍然不允许使用最终字段(这就是您使用 open 的原因),但因此您丢失了数据类自动提供的那些派生方法。 数据类从根本上来说是有问题的,因为它们本质上是做 AutoValue 所做的,所以我们是否能支持数据类作为 RealmObjects 是值得怀疑的。参见例如github.com/realm/realm-java/issues/4291,它描述了我们当前的想法。 (搜索 AutoValue,这是一个很长的文本)。 @GoRoS 虽然示例代码已更新以删除 kotlin 属性上的 open 修饰符,但我认为仍然有必要保留它们,因为当从 Kotlin 代码访问它们时,它似乎仍然在某些情况下获取原始字段值。【参考方案2】:

any 类中的任何 Kotlin 属性都有一个 getter 和一个 setter。所以我相信你的代码应该按照你自己的建议工作(没有data 修饰符)。

https://kotlinlang.org/docs/reference/data-classes.html#data-classes https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#properties

附:我同意关于属性的文档在这个主题上不清楚

【讨论】:

以上是关于RealmObject 的 Kotlin 数据类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用android [关闭]获取RealmObject中的最后一个修改过的RealmObject或字段

启动 Xamarin Forms Android 应用程序时未找到 RealmObject

如何修复“RealmObject 不能作为函数调用”realm-js 错误?

RealmObject Equatable 冗余消息

RealmObject Equatable冗余消息

错误:任务“:app:compileDebugJavaWithJavac”执行失败。 > 扩展 RealmObject 类后编译失败