android - room - Persistencia de sala: Error: Entidades y Pojos deben tener un constructor público utilizable
kotlin room example (10)
Estoy convirtiendo un proyecto a Kotlin y estoy tratando de hacer de mi modelo (que también es mi entidad) una clase de datos que pretendo usar Moshi para convertir las respuestas JSON de la 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
)
No puedo construir la aplicación causa del siguiente error
Entidades y Pojos deben tener un constructor público utilizable. Puede tener un constructor vacío o un constructor cuyos parámetros coincidan con los campos (por nombre y tipo). No se puede encontrar setter para el campo.
Los ejemplos que encontré no están lejos de this
¿Ideas sobre cómo resolverlo?
Creo que una buena opción para resolverlo es:
@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
)
Kotlin permite el tiempo como un nombre de parámetro, pero esto no funcionará cuando la habitación genere el código Java.
Lo que funcionó para mí:
@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
)
Puedes intentar cambiar el nombre de las variables en su lugar
Resultó ser un error en la biblioteca https://github.com/googlesamples/android-architecture-components/issues/49
También tuve este problema, pero me di cuenta de que el problema era que agregué la anotación @Embedded a una propiedad que ya tenía un convertidor de tipo, por lo que cualquier persona que tenga el mismo problema debería verificar las declaraciones de propiedad de su clase modelo y asegurarse de que la @ La anotación incrustada no se encuentra en una propiedad que tenga asociado un convertidor de tipo.
Tenía un problema similar antes.
Primero he actualizado / agregado el apply plugin: ''kotlin-kapt''
a gradle.
A continuación, lo he usado en lugar de annotationProcessor
en gradle:
kapt "android.arch.persistence.room:compiler:1.0.0-alpha4"
Lo último fue crear una clase de datos inmutables:
@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
)
ACTUALIZAR:
Esta solución funciona cuando tiene clases para el modelo y clases para la base de datos en el mismo módulo de Android. Si tiene clases modelo en el módulo de la biblioteca de Android y el resto del código en su módulo principal, Room no las reconocerá.
Tuve este problema con una entidad (todos los campos fueron var
inicializados correctamente, como lo sugieren muchas de las respuestas aquí) que incluían una lista de elementos relacionados, no primitivos, como el OP en esta pregunta de SO . Por ejemplo:
@Entity(tableName = "fruits")
data class CachedFruitEntity(
@PrimaryKey var id: Long = 0L,
@Embedded(prefix = "buyer_") var buyerEntity: CachedBuyerEntity? = null
@TypeConverters(VendorsConverter::class)
var vendorEntities: List<CachedVendorEntity?> = listOf()))
Es decir, tiene un campo incorporado, y me tomó un tiempo darme cuenta de que lo que realmente necesitaba era un convertidor de tipo para la lista de entidades proveedoras (el compilador no estaba lanzando el Error:(58, 31) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
habitual Error:(58, 31) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
Por Error:(58, 31) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
tanto, mi solución fue muy similar a esta respuesta.
Este subproceso de github de los componentes de la arquitectura de Google tiene más información sobre este error engañoso, pero no está seguro si el problema se ha solucionado aún.
necesitas especificar un constructor secundario como este:
@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)
}
https://issuetracker.google.com/issues/62851733
¡Encontré que este es el error de proyección de @Relación! No es problema de lenguaje Kotlin. El google basado en GithubBrowserSample java también hapendido un error, pero un mensaje de error diferente.
a continuación es mi código kotlin:
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()
)
derecho:
data class UserWithCommunities(
@Embedded
var user: User = User(0, null),
@Relation(parentColumn = "id",
entityColumn = "users_id",
entity = CommunityUsers::class)
var communityList: List<CommunityUsers> = emptyList()
)