0

Um eine OneToMany-Beziehung mit Room zu erhalten, erstelle ich einen POJO mit @Embedded-Objekt und @Relation Variable.Raum: verwandte Entitäten - verwendbarer öffentlicher Konstruktor

data class SubjectView(
    @Embedded 
    var subject: Subject, 

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

Aber beim Kompilieren ich diesen Fehler haben

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] 

Nun, das Konstruktor [Thema: Thema, Themen: null] sieht aus wie die gut ???

Wenn ich jedoch meine Klasse mit Nein-Arg-Konstruktor und All-Params-Konstruktor ändern, funktioniert es.

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

Ich mag möchte wissen, warum die erste (schneller) Version kompiliert nicht, da sie nicht wie die Dokumentation zeigt ist.

Standard-Argumente für alle Variablen (wie ich in einem anderen Beitrag gesehen haben könnte) in einer Konstruktor (Daten) -Klasse scheint nicht zwingend erforderlich zu sein?

Dank

Antwort

0

Es gibt mehrere Themen wie Datenklasse die Konstrukteure erzeugen.

Da Sie ein Nullable-Objekt in Ihrem Konstruktor haben, werden alle möglichen Konstruktoren generiert. Das heißt, es erzeugt

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

Es gibt zwei Möglichkeiten, das zu lösen. Die erste besteht darin, alle Werte wie zu definieren und einen anderen ignorierten Konstruktor mit dem gewünschten Konstruktor zu erzeugen.

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

Ein anderer Weg ist die Schaffung einer halbgefüllten Datenklasse wie

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

Darauf achten, dass die erste Lösung, die richtige Lösung ist, und Sie müssen @Ignore einem anderen Konstruktor setzen.

+0

Großartig, vielen Dank für diese Erklärung –

+0

Ihre Begrüßung :-) –

+0

Hallo! Ich verstehe Ihre Antwort nicht, weil Sie "Themen" nicht null machen. Oder wir möchten, dass "Themen" nullfähig sein können ... – Blunderer

Verwandte Themen