RealmObject 的 Kotlin 数据类

     2023-02-16     63

关键词:

【中文标题】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

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

【讨论】:

kotlin常用的kotlin类①(嵌套类|数据类|数据类copy函数|数据类解构声明operatorfuncomponent1|数据类运算符重载)(代码片段)

...类二、数据类三、数据类copy函数四、数据类解构声明1、Kotlin普通类解构声明operatorfuncomponent12、数据类解构声明五、运算符重载函数一、嵌套类嵌套类指的是在类A中定义类B,一般是类B对类A有一定的作用,将类B嵌套进类A中;格式如... 查看详情

kotlin常用的kotlin类①(嵌套类|数据类|数据类copy函数|数据类解构声明operatorfuncomponent1|数据类运算符重载)(代码片段)

...类二、数据类三、数据类copy函数四、数据类解构声明1、Kotlin普通类解构声明operatorfuncomponent12、数据类解构声明五、运算符重载函数一、嵌套类嵌套类指的是在类A中定义类B,一般是类B对类A有一定的作用,将类B嵌套进类A中;格式如... 查看详情

在 Kotlin 中扩展数据类

】在Kotlin中扩展数据类【英文标题】:ExtenddataclassinKotlin【发布时间】:2014-12-1403:59:07【问题描述】:数据类似乎是Java中老式POJO的替代品。这些类允许继承是可以预料的,但我看不出扩展数据类的方便方法。我需要的是这样的... 查看详情

使用 GSON 来自 Json 的 Kotlin 数据类

】使用GSON来自Json的Kotlin数据类【英文标题】:KotlinDataClassfromJsonusingGSON【发布时间】:2017-10-2209:54:15【问题描述】:我有这样的JavaPOJO类:classTopic@SerializedName("id")longid;@SerializedName("name")Stringname;我有一个像这样的Kotlin数据类datacl... 查看详情

从 Kotlin 中的密封类扩展数据类

】从Kotlin中的密封类扩展数据类【英文标题】:ExtendingdataclassfromasealedclassinKotlin【发布时间】:2017-11-0905:46:33【问题描述】:我有一组共享一些公共字段的数据类,所以理想情况下,我想在超类型中声明它们(本例中为Message)... 查看详情

Proguard - 不要混淆 Kotlin 数据类

】Proguard-不要混淆Kotlin数据类【英文标题】:Proguard-donotobfuscateKotlindataclasses【发布时间】:2018-02-1607:54:46【问题描述】:在我的项目中,我将AutoValue用于我的旧模型类。我开始使用Kotlin,我想使用DataClasses而不是AutoValue。我想在... 查看详情

kotlin基础-数据类

...不是指保存到磁盘,而是指转换成文本格式,便于保存*Kotlin数据类:dataclass类名(属性列表)***/dataclassArticle(varid:Int,vartitle:String,varcontent:String)funmain(args:Array<String>){valart 查看详情

暴露属性和 Kotlin 数据类的接口

】暴露属性和Kotlin数据类的接口【英文标题】:InterfacesexposingpropertiesandKotlindataclasses【发布时间】:2019-12-1411:48:28【问题描述】:我在Kotlin中有一个数据类:dataclassImage(valname:String,valurl:URL)我想通过REST(SpringBoot,JPA)提供这些... 查看详情

Json 到 kotlin 数据类 [关闭]

】Json到kotlin数据类[关闭]【英文标题】:Jsontokotlindataclasses[closed]【发布时间】:2017-03-1610:38:41【问题描述】:是否存在从json模型生成kotlin数据类的服务,其工作方式与http://www.jsonschema2pojo.org/站点上的工作方式相同?我的新项目... 查看详情

Kotlin 数据类

】Kotlin数据类【英文标题】:KotlinDataclass【发布时间】:2019-08-1620:43:49【问题描述】:我在java中有以下POJO,它在SpringBoot应用程序中用于在应用程序启动期间从YML注入属性。尝试将应用程序转换为Kotlin,但是当我将POJO转换为数... 查看详情

Kotlin 数据类的房间数据库错误

】Kotlin数据类的房间数据库错误【英文标题】:RoomDatabaseerrorwithKotlinDataClass【发布时间】:2018-03-2804:55:20【问题描述】:我已经开始使用Room,但遇到了阻塞问题。我已经完成并修复了Room库中的所有编译时检查,但现在遇到以下... 查看详情

Kotlin 数据类中的函数作为参数导致打包错误

】Kotlin数据类中的函数作为参数导致打包错误【英文标题】:FunctioninKotlindataclassasargumentleadstoparcelingerror【发布时间】:2018-08-2905:56:15【问题描述】:我在Kotlin中有一个数据类,它使用@Parcelize注释来轻松打包。问题是我现在想将... 查看详情

如何在 Kotlin 中将数据类转换为 ByteBuffer?

】如何在Kotlin中将数据类转换为ByteBuffer?【英文标题】:HowtoconvertaDataClasstoByteBufferinKotlin?【发布时间】:2019-02-0707:17:42【问题描述】:我正在尝试使用Kinesis,它需要字节缓冲区格式的数据。到目前为止,我看到的所有示例都是... 查看详情

如何使用 kotlin 数据类获取 Firestore 文档的文档 ID

】如何使用kotlin数据类获取Firestore文档的文档ID【英文标题】:HowdoIgetthedocumentIDforaFirestoredocumentusingkotlindataclasses【发布时间】:2018-04-1005:48:36【问题描述】:我有kotlin数据类dataclassClient(valname:String="",valemail:String="",valphone:String=""... 查看详情

kotlin数据类与密封类(代码片段)

数据类Kotlin可以创建一个只包含数据的类,关键字为 data:dataclassUser(valname:String,valage:Int)编译器会自动的从主构造函数中根据所有声明的属性提取以下函数:equals() / hashCode()toString() 格式如 "User(name=John,age=42)"co... 查看详情

将 Kotlin 内联类作为实体字段的房间数据库

】将Kotlin内联类作为实体字段的房间数据库【英文标题】:RoomdatabasewithKotlininlineclassasanEntityfield【发布时间】:2020-01-3121:02:48【问题描述】:我正在尝试让Room(https://developer.android.com/topic/libraries/architecture/room)与Kotlin的内联类一起... 查看详情

Java -> Kotlin。数据类转换模式

】Java->Kotlin。数据类转换模式【英文标题】:Java->Kotlin.Dataclassesconversionpattern【发布时间】:2018-10-1703:45:39【问题描述】:我正在用maven编写一个SpringBoot应用程序。但是最近我将JDK升级到10,Lombokstable停止使用它。我认为这... 查看详情

Kotlin - 数据类实体抛出 ***Error

】Kotlin-数据类实体抛出***Error【英文标题】:Kotlin-Dataclassentitythrows***Error【发布时间】:2018-08-0206:16:38【问题描述】:我尝试将kotlin(版本1.2.21)与spring-boot(1.5.9.RELEASE)结合起来。我在使用带有@Entity注释的数据类时遇到了问... 查看详情