ошибка: сущности и Pojos должны иметь открытый конструктор.Котлин - PullRequest
0 голосов
/ 20 июня 2019

У меня есть следующий класс:

package com.mikhailovskii.trakttv.data.entity

import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey
import androidx.room.TypeConverters

import com.google.gson.annotations.Expose
import com.google.gson.annotations.SerializedName
import com.mikhailovskii.trakttv.db.room.MovieIdConverter

@Entity
class Movie {

    @PrimaryKey(autoGenerate = true)
    var id: Int = 0

    @SerializedName("ids")
    @Expose
    @TypeConverters(MovieIdConverter::class)
    var movieId: MovieId? = null

    @SerializedName("title")
    @Expose
    var name: String? = null

    @SerializedName("year")
    @Expose
    var year: Int = 0

    @SerializedName("tagline")
    @Expose
    var tagline: String? = null

    @SerializedName("released")
    @Expose
    var released: String? = null

    @SerializedName("runtime")
    @Expose
    var runtime: Int = 0

    @SerializedName("country")
    @Expose
    var country: String? = null

    @SerializedName("overview")
    @Expose
    var overview: String? = null

    var iconUrl: String? = null

    var watchers: Int = 0

    //For movie list
    @Ignore
    constructor(iconUrl: String, name: String, year: Int, slugId: String, watchers: Int) {
        this.iconUrl = iconUrl
        this.name = name
        this.year = year
        this.movieId?.slug = slugId
        this.watchers = watchers
    }

    //For movie detail
    @Ignore
    constructor(iconUrl: String, name: String, year: Int, tagline: String, released: String, runtime: Int, country: String, overview: String, slugId: String, watchers: Int) {
        this.iconUrl = iconUrl
        this.name = name
        this.year = year
        this.tagline = tagline
        this.released = released
        this.runtime = runtime
        this.country = country
        this.overview = overview
        this.movieId?.slug = slugId
        this.watchers = watchers
    }

    //For room
    constructor(name: String, watchers: Int, iconUrl: String, slugId: String) {
        this.iconUrl = iconUrl
        this.movieId?.slug = slugId
        this.watchers = watchers
        this.name = name
    }

}

Этот класс используется для нескольких целей, таких как анализ JSON Object, добавление данных в Room DB и просто для создания объектов. И я столкнулся со следующей проблемой:

ошибка: сущности и Pojos должны иметь открытый конструктор. Вы можете иметь пустой конструктор или конструктор, параметры которого соответствуют поля (по имени и типу).

public final class Movie {
             ^

Я посмотрел предыдущие вопросы об этой же проблеме (особенно this ) и, как я понимаю, моя проблема в этой строке в конструкторах:

this.movieId?.slug = slugId 

Имена не совпадают. но я не вижу возможности сопоставить эти имена, так как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Вам нужен пустой конструктор или конструктор всех параметров.Поэтому, если вы добавите constructor(), проблема будет решена

0 голосов
/ 20 июня 2019

Так что вам не нужно добавлять пустой конструктор вручную ко всем сущностям, вы можете использовать плагин компилятора :

plugins {
  id "org.jetbrains.kotlin.plugin.noarg" version "1.3.31"
}

noArg {
    annotation("androidx.room.Entity")
}
...