Как исправить сущности и POJO должны иметь пригодный для использования конструктор publi c - PullRequest
0 голосов
/ 28 апреля 2020

Я получил эту ошибку при попытке запустить свое приложение при использовании базы данных sqlite.

У меня есть 3 класса данных в отдельных файлах:

@Entity(tableName = "movies")
data class MovieNews(
    @PrimaryKey(autoGenerate = true)
    var id: Int? = null,
    @SerializedName("movie_db")
    @Embedded(prefix = "movies_")
    val movies: List<Movies>? = null,
)

data class Movies(
    val description: String? = null,
    @Embedded(prefix = "actors_")
    val actors: List<Actors>? = null,

)

data class Actors(
    val name: String? = null
    val age: Int? = null
)

Когда я запустил приложение, я получил ошибка:

ошибка: у сущностей и POJO должен быть пригодный для использования конструктор publi c. Вы можете иметь пустой конструктор или конструктор, параметры которого соответствуют полям (по имени и типу). - java .util.List

Как я могу исправить эту ошибку?

Не знаю, связано ли это с проблемой, но у меня есть это предупреждение

w: [kapt] Запрошена обработка добавочной аннотации, но поддержка отключена, поскольку следующие процессоры не являются инкрементными: androidx.room.RoomProcessor (DYNAMI C).

Я также видел кучу вопросов об этой ошибке, но ни один из них не решил мою проблему

ОБНОВЛЕНИЕ:

Если я закомментирую строку Embedded, приложение выполняет компиляцию.

Я копался в вопросах stackoverflow и обнаружил, что, вероятно, существует проблема с Embedded и Списки.

   @SerializedName("movie_db")
    @Embedded(prefix = "movies_")
    val movies: List<Movies>? = null,

1 Ответ

0 голосов
/ 28 апреля 2020

Общий случай:

data class MyDataClass(
  var myfield: String
){
  constructor(myfield: String): this(myfield)
}

Для ваших классов данных: Просто укажите значение по умолчанию в конструкторе:

@Entity(tableName = "movies")
data class MovieNews(
    @PrimaryKey(autoGenerate = true)
    var id: Int? = null,
    @SerializedName("movie_db")
    @Embedded(prefix = "movies_")
    val movies: List<Movies>? = null,
){
  constructor(): this(0, "", listOf())
}

data class Movies(
    val description: String? = null,
    @Embedded(prefix = "actors_")
    val actors: List<Actors>? = null,
) // same

data class Actors(
    val name: String? = null
    val age: Int? = null
) //same

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

Если вам не нравится решение: просто удалите ? и сделайте все val НО, предоставьте значение по умолчанию.

Вторая вещь не связана с вашей проблемой, но может быть исправлена ​​добавлением:

javaCompileOptions {
            annotationProcessorOptions {
                arguments = [
                        "room.schemaLocation"  : "$projectDir/schemas".toString(),
                        "room.incremental"     : "true",
                        "room.expandProjection": "true"]
            }
        }

В вашем buidl.gradle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...