Я конвертирую проект в Kotlin, и я пытаюсь сделать свою модель (которая также является моей сущностью) классом данных, который я намерен использовать Moshi для преобразования ответов JSON из API
@Entity(tableName = "movies") data class MovieKt( @PrimaryKey var id : Int, var title: String, var overview: String, var poster_path: String, var backdrop_path: String, var release_date: String, var vote_average: Double, var isFavorite: Int )
Я не могу создать причину приложения следующей ошибки
У объектов и Pojos должен быть полезный публичный конструктор. У вас может быть пустой конструктор или конструктор, параметры которого соответствуют полям (по имени и типу). Невозможно найти установщик для поля.
Примеры, которые я нашел, находятся недалеко от этого
Идеи о том, как его решить?
Раньше была аналогичная проблема.
Сначала я обновил / добавил apply plugin: 'kotlin-kapt'
для градиента.
Затем я использовал его вместо annotationProcessor
в gradle:
kapt "android.arch.persistence.room:compiler:1.0.0-alpha4"
Последнее заключалось в создании неизменяемого класса данных:
@Entity(tableName = "movies") data class MovieKt( @PrimaryKey val id : Int, val title: String, val overview: String, val poster_path: String, val backdrop_path: String, val release_date: String, val vote_average: Double, val isFavorite: Int )
ОБНОВИТЬ:
Это решение работает, когда у вас есть классы для модели и классы для базы данных в одном Android-модуле. Если у вас есть классы моделей в модуле библиотеки Android и остальная часть кода в основном модуле, Room не узнает их.
вам нужно указать вспомогательный конструктор, например:
@Entity(tableName = "movies") data class MovieKt( @PrimaryKey var id : Int, var title: String, var overview: String, var poster_path: String, var backdrop_path: String, var release_date: String, var vote_average: Double, var isFavorite: Int ) { constructor() : this(0, "", "", "", "", "", 0.0, 0) }
Что сработало для меня:
@Entity(tableName = "movies") data class MovieKt( @PrimaryKey var id : Int? = 0, var title: String? = "", var overview: String? = "", var poster_path: String? = "", var backdrop_path: String? = "", var release_date: String? = "", var vote_average: Double? = 0.0, var isFavorite: Int? = 0 )
Это оказалось ошибкой в библиотеке https://github.com/googlesamples/android-architecture-components/issues/49
https://issuetracker.google.com/issues/62851733
Я нашел, что это ошибка проекции @ Relation! не проблема языка Котлина. основанный на Google GithubBrowserSample java, также произошла ошибка, но другое сообщение об ошибке.
ниже мой котлин код:
data class UserWithCommunities( @Embedded var user: User = User(0, null), @Relation(parentColumn = "id", entityColumn = "users_id", entity = CommunityUsers::class, projection = arrayOf("communities_id")) // delete this line. var communityIds: List<Int> = emptyList() )
правильно:
data class UserWithCommunities( @Embedded var user: User = User(0, null), @Relation(parentColumn = "id", entityColumn = "users_id", entity = CommunityUsers::class) var communityList: List<CommunityUsers> = emptyList() )
Я думаю, что хороший вариант для решения:
@Entity(tableName = "movies") data class MovieKt( @PrimaryKey var id : Int = 0, var title: String = "", var overview: String = "", var poster_path: String = "", var backdrop_path: String = "", var release_date: String = "", var vote_average: Double = 0.0, var isFavorite: Int = 0 )