База даних кімнат з класом Inline класом Kotlin як поле Entity


10

Я намагаюся змусити кімнату ( https://developer.android.com/topic/libraries/architecture/room ) працювати з вбудованими класами Котліна, як описано в статті Джейк Уортонс. Inline Classes зробити великі ідентифікатори бази даних :

@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(або 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;
}

Хтось зараз, як зберегти конструктор за замовчуванням загальнодоступним під час використання Inline Classes як властивості сутності даних?


1
Ви порушили це питання на якомусь трекері випусків? Я думаю , це потрібно уточнити точно
K.Os

Відповіді:


0

Я вважаю, що причина полягає в тому, що клас ID буде представлений як String під час виконання. Отже додатковий параметр $ constructor_marker - це гарантувати унікальність підпису конструктора MyEntity (String id, String title), тому що цей конструктор міг би бути вже визначений. Але я просто спекулюю тут.

Чи можете ви спробувати чітко визначити цей конструктор у класі MyEntity і подивитися, чи він працює?


Цей конструктор вже визначений явним (але з синтаксичним цукром) уdata class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk

1
Ви визначили конструктор з параметрами (ID, String), я мав на увазі конструктор із (String, String). Я спробував, але, схоже, це неможливо. Я отримав помилку "Сутичка декларації платформи".
Дієго Марін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.