Database kamar dengan kelas inlin Kotlin sebagai bidang Entitas

9

Saya mencoba mendapatkan Room ( https://developer.android.com/topic/libraries/architecture/room ) bekerja dengan kelas inline Kotlin seperti yang dijelaskan dalam artikel Jake Whartons artikel Kelas Inline Membuat ID Database yang Hebat :

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

inline class ID(val value: String)

Saat menyusun Kamar ini mengeluh itu

Entitas dan Pojo harus memiliki konstruktor publik yang dapat digunakan. Anda dapat memiliki konstruktor kosong atau konstruktor yang parameternya cocok dengan bidang (berdasarkan nama dan jenis).

Melihat ke kode Java yang dihasilkan saya menemukan:

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);
}

Secara misterius konstruktor default bersifat pribadi sekarang.

Saat menggunakan Stringsebagai tipe untuk id(atau a typealias), konstruktor kelas Java yang dihasilkan tampak seperti yang diharapkan:

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

Apakah seseorang sekarang bagaimana membuat konstruktor default tetap publik saat menggunakan Kelas Inline sebagai properti entitas data?

whlk
sumber
Apakah Anda mengajukan masalah untuk ini pada beberapa pelacak masalah? Saya kira ini perlu diklarifikasi dengan pasti
K.

Jawaban:

0

Saya percaya alasannya adalah bahwa kelas ID akan direpresentasikan sebagai String dalam runtime. Jadi parameter tambahan $ constructor_marker adalah untuk menjamin keunikan tanda tangan konstruktor MyEntity (String id, String title), karena konstruktor ini sudah dapat didefinisikan. Tapi saya hanya berspekulasi di sini.

Bisakah Anda mencoba mendefinisikan konstruktor ini secara eksplisit di kelas MyEntity dan melihat apakah itu berfungsi?

Diego Marin
sumber
Konstruktor ini sudah didefinisikan secara eksplisit (tetapi dengan gula sintaksis) didata class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk
Anda mendefinisikan konstruktor dengan parameter (ID, String), maksud saya konstruktor dengan (String, String). Saya mencoba, tetapi sepertinya itu tidak mungkin. Saya mendapat kesalahan "Platform declaration clash".
Diego Marin