android — Комната: связанные лица - полезный общественный конструктор" />

Комната: связанные лица - полезный общественный конструктор

Чтобы получить отношение 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] выглядит как хороший ???

Однако, если я изменю свой класс с помощью конструктора без аргументов и конструктора всех параметров, это сработает.

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

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

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

Спасибо

4 голоса | спросил Tweety B 26 +03002017-10-26T16:47:30+03:00312017bEurope/MoscowThu, 26 Oct 2017 16:47:30 +0300 2017, 16:47:30

1 ответ


0

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

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

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 для любого другого конструктора.

ответил Emanuel S 26 +03002017-10-26T16:54:20+03:00312017bEurope/MoscowThu, 26 Oct 2017 16:54:20 +0300 2017, 16:54:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132