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

whl*_*hlk 13 android kotlin android-room kotlin-experimental

我正在尝试让 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)
Run Code Online (Sandbox Code Playgroud)

编译这个房间时抱怨说

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

查看生成的 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);
}
Run Code Online (Sandbox Code Playgroud)

神秘的是,默认构造函数现在是私有的。

String用作id( 或 a 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Die*_*rin 0

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

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