База данных комнат со встроенным классом Kotlin в качестве поля Entity

10

Я пытаюсь заставить Room ( https://developer.android.com/topic/libraries/architecture/room ) работать со встроенными классами Kotlin, как описано в статье Джейка Уортона « Встроенные классы, которые создают отличные идентификаторы базы данных» :

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

Кто-нибудь теперь, как сохранить конструктор по умолчанию общедоступным при использовании встроенных классов в качестве свойств объекта данных?

whlk
источник
1
Вы поднимали проблему для этого на каком-то трекере? Я думаю, это нужно уточнить наверняка
К.О.

Ответы:

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). Я пытался, но кажется, что это невозможно. Я получил сообщение об ошибке "Объявление платформы".
Диего Марин