Комната: связанные объекты – полезный публичный конструктор

Чтобы получить отношение OneToMany к Room, я создаю POJO с объектом @Embedded и переменной @Relation .

data class SubjectView( @Embedded var subject: Subject, @Relation(parentColumn = "idWeb", entityColumn = "subject_id", entity = Topic::class) var topics: List<Topic>? ) 

Но при компиляции у меня есть эта ошибка

  error: Entities and Pojos must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type) [...] Tried the following constructors but they failed to match: SubjectView(biz.eventually.atpl.data.db.Subject,java.util.List<biz.eventually.atpl.data.db.Topic>) : [subject : subject, topics : null] 

Ну, этот конструктор [subject: subject, themes: null] выглядит как хороший ???

Однако, если я изменю свой класс с конструктором no-arg и всем конструктором params, он работает.

 class SubjectView() { @Embedded var subject: Subject = Subject(-1, -1, "") @Relation(parentColumn = "idWeb", entityColumn = "subject_id", entity = Topic::class) var topics: List<Topic>? = null constructor(subject: Subject, topics: List<Topic>?) : this() { this.subject = subject this.topics = topics } } 

Я хотел бы знать, почему первая (более быстрая) версия не компилируется, поскольку это не так, как показывает документация.

Аргументы по умолчанию для всех переменных (как я мог видеть на другой должности) в классе конструктора (данных), по-видимому, не являются обязательными?

благодаря

Существует несколько тем, как класс данных генерирует конструкторы.

Поскольку у вас есть объект с нулевым значением внутри вашего конструктора, он генерирует все возможные конструкторы. Это означает, что он генерирует

 constructor(var subject: Subject) constructor(var subject: Subject, var topics: List<Topic>) 

Есть два способа решить это. Первый – предопределить все значения типа и создать другой проигнорированный конструктор с требуемым конструктором.

 data class SubjectView( @Embedded var subject: Subject, @Relation(parentColumn = "idWeb", entityColumn = "subject_id", entity = Topic::class) var topics: List<Topic> = ArrayList() ) { @Ignore constructor(var subject: Subject) : this(subject, ArrayList()) } 

Другой способ – создать наполовину заполненный класс данных, например

 data class SubjectView(@Embedded var subject: Subject) { @Relation var topics: List<Topic> = ArrayList() } 

Позаботьтесь о том, чтобы первое решение было правильным решением, и вам нужно установить @Ignore на любой другой конструктор.