将Kotlin内联类作为实体字段的会议室数据库


9

我试图让Room(https://developer.android.com/topic/libraries/architecture/room)与Kotlin的内联类一起工作,如Jake Whartons文章内联类使数据库ID大

@Entity
data class MyEntity(
    @PrimaryKey val id: ID,
    val title: String
)

inline class ID(val value: String)

编译此房间时抱怨

实体和Pojos必须具有可用的公共构造函数。您可以有一个空的构造函数或一个其参数与字段匹配的构造函数(按名称和类型)。

查看生成的Java代码,我发现:

private MyEntity(String id, String title) {
      this.id = id;
      this.title = title;
}

// $FF: synthetic method
public MyEntity(String id, String title, DefaultConstructorMarker $constructor_marker) {
      this(id, title);
}

奇怪的是,默认构造函数现在是私有的。

String用作id(或typealias)的类型时,生成的Java类构造函数看起来像预期的那样:

public MyEntity(@NotNull String id, @NotNull String title) {
  Intrinsics.checkParameterIsNotNull(id, "id");
  Intrinsics.checkParameterIsNotNull(title, "title");
  super();
  this.id = id;
  this.title = title;
}

现在有人在将内联类用作数据实体属性时如何使默认构造函数公开吗?


您是否在某个问题跟踪器上为此提出了问题?我猜想这需要确定
-K.Os,

Answers:


0

我相信原因是ID类在运行时将表示为String。因此,$ constructor_marker附加参数是为了保证MyEntity(String id,String title)构造函数签名的唯一性,因为可能已经定义了该构造函数。但我只是在推测。

您能否尝试在MyEntity类中显式定义此构造函数,然后查看其是否有效?


该构造函数已经在data class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk

您定义了带有(ID,String)参数的构造函数,我的意思是带有(String,String)的构造函数。我尝试过,但似乎不可能。我收到“平台声明冲突”错误。
迭戈·马林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.