Frage Room kann keinen Konstruktor auswählen, da mehrere Konstruktoren als Fehler geeignet sind


Ich versuche, persistente Bibliothek in meinem Android-Kotlin-Projekt zu implementieren, aber diesen Fehler bei der Kompilierung zu fangen:

error: Room kann keinen Konstruktor auswählen, da mehrere Konstruktoren vorhanden sind   geeignet. Versuchen Sie, unerwünschte Konstruktoren mit @Ignore zu kommentieren.

Fehlercode:

@Entity
data class Site(
        var name: String = "",
        var url: String = "",
        @PrimaryKey(autoGenerate = true) var id: Long = 0)

12
2018-06-19 00:39


Ursprung


Antworten:


Ich hatte diesen Fehler, weil Kotlin anscheinend mehrere Java-Konstruktoren für einen einzelnen Kotlin-Konstruktor mit Standardargumentwerten generiert. Arbeitscode siehe nächsten:

@Entity
data class Site(
        var name: String,
        var url: String,
        @PrimaryKey(autoGenerate = true) var id: Long)

10
2018-06-19 00:39



Keine der obigen Lösungen ist gut, da sie funktionieren, aber Fehler verursachen können.

Kotlins Datenklasse generiert mehrere Methoden mit dem Standardkonstruktor. Das bedeutet, dass gleich (), Hash-Code(), toString (), componentN () -Funktionen und Kopieren() wird mit den Attributen generiert, die Sie Ihrem Konstruktor zuweisen.

Verwenden Sie die oben genannten Lösungen wie

@Entity data class Site(@PrimaryKey(autoGenerate = true) var id: Long) {
    @Ignore constructor() : this(0)
    var name: String = ""
    var url: String = ""
} 

generiert alle oben aufgeführten Methoden nur für die ID. Die Verwendung von equals führt zu unerwünschter Qualität, genau wie toString (). Um dies zu lösen, müssen Sie alle Attribute haben, die Sie im Konstruktor bearbeiten möchten, und einen zweiten Konstruktor hinzufügen, der ignore verwendet

@Entity data class Site(
    @NonNull @PrimaryKey(autoGenerate = true) var id: Long,
    var name: String = "",
    var url: String = "") {
    @Ignore constructor(id = 0, name = ", url = "") : this()
} 

Sie sollten wirklich im Hinterkopf behalten, dass Sie normalerweise Datenklassen verwenden, um Methoden wie String und kopieren zu haben. Nur diese Lösung arbeitet daran, unerwünschte Fehler während der Laufzeit zu vermeiden.


5
2017-10-02 13:54



Das hat für mich funktioniert:

@Entity
data class Site(
    @PrimaryKey(autoGenerate = true) var id: Long = 0),
    var name: String = "",
    var url: String = "",
    @Ignore var ignored: String? = null
)

2
2018-06-30 18:41



Hier ändern Sie Ihre App-Datenbank version und Programm Agian neu starten, es wird funktionieren:

@Database(entities = arrayOf(Site::class), version = 123) abstract class YourAppDatabase : RoomDatabase() {
    abstract fun yourDao(): YourDao
}

und du kannst das auch versuchen data class:

    @Entity
    data class Site(@PrimaryKey(autoGenerate = true) var id: Long) {
    @Ignore constructor() : this(0)
    var name: String = "",
    var url: String = "",
}

und die letzte Anweisung: Ihr Primärschlüssel id sollte sein manuell erhöht.

Hoffe das funktioniert für dich. :)

Prüfen Sie, ob die obigen Antworten ungültig sind.

data class TestModel(var id: Int = 0) {
    constructor() : this(0)

    var name: String = "defaultname"
    var testData: String = "defaulttestData"
}

val testModel = TestModel(5)
testModel.name = "test"

val testModel2 = TestModel(5)
testModel2.testData = "testdata"
testModel2.name = "test"

info { "Test with name set: $testModel" }
info { "Testdata equals Testdata2 ${testModel.equals(testModel2)}" }

Gibt Test mit dem Namen set zurück: TestModel (id = 5) und Testdata entspricht Testdata2 true


0
2017-07-02 07:59



Ich lasse nur meine Antwort, falls das irgendjemandem hilft. Ich stieß auf das gleiche Problem, keine der oben genannten Antworten funktionierte. Das einzige, was funktionierte, war der Wechsel von einem data class zu einem class. Ich lade jeden ein, den gleichen Code auszuprobieren und zu erklären, warum es den Trick geschafft hat:

Vor

@Entity
data class ImgurGalleryPost (
    @NotNull @PrimaryKey
    var id: String,
    var title: String?,
    var description: String?,
    var datetime: Int?,
    var cover: String?,
    var coverWidth: Int?,
    var coverHeight: Int?,
    var accountUrl: String?,
    var accountId: Int?,
    var privacy: String?,
    var layout: String?,
    var views: Int?,
    var link: String?,
    var ups: Int?,
    var downs: Int?,
    var points: Int?,
    var score: Int?,
    var isAlbum: Boolean?,
    var vote: Boolean?,
    var favorite: Boolean?,
    var nsfw: Boolean?,
    var section: String?,
    var commentCount: Int?,
    var favoriteCount: Int?,
    var topic: String?,
    var topicId: Int?,
    var imagesCount: Int?,
    var inGallery: Boolean?,
    var isAd: Boolean?,
    @NotNull @Ignore
    var tags: List<ImgurGalleryTag>,
    var inMostViral: Boolean?,
    @NotNull @Ignore
    var images: List<ImgurGalleryImage>
)

Nach

@Entity
class ImgurGalleryPost (
    @NotNull @PrimaryKey
    var id: String,
    var title: String?,
    var description: String?,
    var datetime: Int?,
    var cover: String?,
    var coverWidth: Int?,
    var coverHeight: Int?,
    var accountUrl: String?,
    var accountId: Int?,
    var privacy: String?,
    var layout: String?,
    var views: Int?,
    var link: String?,
    var ups: Int?,
    var downs: Int?,
    var points: Int?,
    var score: Int?,
    var isAlbum: Boolean?,
    var vote: Boolean?,
    var favorite: Boolean?,
    var nsfw: Boolean?,
    var section: String?,
    var commentCount: Int?,
    var favoriteCount: Int?,
    var topic: String?,
    var topicId: Int?,
    var imagesCount: Int?,
    var inGallery: Boolean?,
    var isAd: Boolean?,
    @NotNull @Ignore
    var tags: List<ImgurGalleryTag>,
    var inMostViral: Boolean?,
    @NotNull @Ignore
    var images: 

List<ImgurGalleryImage>
    )

Es ist wirklich seltsam, aber ich bezweifle, dass dies ein Problem mit dem Android Studio-Cache ist, weil es wieder in den data class bewirkt, dass der Fehler erneut angezeigt wird. Scheint, das ist eine Art Problem mit den Sammlungsfeldern. Ich überprüfte den Konstruktor in der generierten Klasse und es sah gut aus, ich weiß nicht, warum der Build fehlschlug, selbst wenn der Konstruktor korrekt generiert wurde:

public ImgurGalleryPost(@org.jetbrains.annotations.NotNull()
java.lang.String id, @org.jetbrains.annotations.Nullable()
java.lang.String title, @org.jetbrains.annotations.Nullable()
java.lang.String description, @org.jetbrains.annotations.Nullable()
java.lang.Integer datetime, @org.jetbrains.annotations.Nullable()
java.lang.String cover, @org.jetbrains.annotations.Nullable()
java.lang.Integer coverWidth, @org.jetbrains.annotations.Nullable()
java.lang.Integer coverHeight, @org.jetbrains.annotations.Nullable()
java.lang.String accountUrl, @org.jetbrains.annotations.Nullable()
java.lang.Integer accountId, @org.jetbrains.annotations.Nullable()
java.lang.String privacy, @org.jetbrains.annotations.Nullable()
java.lang.String layout, @org.jetbrains.annotations.Nullable()
java.lang.Integer views, @org.jetbrains.annotations.Nullable()
java.lang.String link, @org.jetbrains.annotations.Nullable()
java.lang.Integer ups, @org.jetbrains.annotations.Nullable()
java.lang.Integer downs, @org.jetbrains.annotations.Nullable()
java.lang.Integer points, @org.jetbrains.annotations.Nullable()
java.lang.Integer score, @org.jetbrains.annotations.Nullable()
java.lang.Boolean isAlbum, @org.jetbrains.annotations.Nullable()
java.lang.Boolean vote, @org.jetbrains.annotations.Nullable()
java.lang.Boolean favorite, @org.jetbrains.annotations.Nullable()
java.lang.Boolean nsfw, @org.jetbrains.annotations.Nullable()
java.lang.String section, @org.jetbrains.annotations.Nullable()
java.lang.Integer commentCount, @org.jetbrains.annotations.Nullable()
java.lang.Integer favoriteCount, @org.jetbrains.annotations.Nullable()
java.lang.String topic, @org.jetbrains.annotations.Nullable()
java.lang.Integer topicId, @org.jetbrains.annotations.Nullable()
java.lang.Integer imagesCount, @org.jetbrains.annotations.Nullable()
java.lang.Boolean inGallery, @org.jetbrains.annotations.Nullable()
java.lang.Boolean isAd, @org.jetbrains.annotations.NotNull()
java.util.List<com.kimboo.core.model.ImgurGalleryTag> tags, @org.jetbrains.annotations.Nullable()
java.lang.Boolean inMostViral, @org.jetbrains.annotations.NotNull()
java.util.List<com.kimboo.core.model.ImgurGalleryImage> images) {
    super();
}

Wenn irgendjemand einen Weg finden kann, dies zu beheben, ohne von ihm zu wechseln data class zu class Bitte fühlen Sie sich frei, unten zu kommentieren.


0
2018-06-15 03:14



Das funktioniert für mich

@Entity
data class TaskDetail @Ignore constructor(
    @PrimaryKey(autoGenerate = true)
    var id:Long = 0,
    var taskId:Long = 0,
    var content:String = "")
{
    constructor():this(id = 0)
}

Ich verwende @Ignore, um die ROOM-Warnung zu verbieten

Es gibt mehrere gute Konstruktoren und Room wählt den Konstruktor ohne Argumente aus. Sie können die Annotation @Ignore verwenden, um unerwünschte Konstruktoren zu entfernen.

Und fügen Sie einen Standardkonstruktor für ROOM hinzu.


0
2018-06-28 10:30