104 votes

Persistance de la salle: Erreur: les entités et les pojos doivent avoir un constructeur public utilisable

Je suis la conversion d'un projet de Kotlin et j'essaie de faire de mon modèle (qui est aussi mon entité) de données de classe J'ai l'intention d'utiliser Moshi pour convertir les réponses JSON à partir de l'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
)

Je ne peux pas construire l'application de la cause de l'erreur suivante

Les entités et les Pojo doit avoir un utilisable constructeur public. Vous pouvez avoir un constructeur vide ou un constructeur dont les paramètres correspondent aux champs (nom et type). Impossible de trouver setter pour le champ.

Les exemples que j'ai trouvés ne sont pas loin de cette

Des idées sur comment le résoudre?

44voto

Tomek Polański Points 646

Eu un problème similaire avant.

Tout d'abord j'ai mis à jour/ajout apply plugin: 'kotlin-kapt' de gradle.

Ensuite, je l'ai utilisé à la place de annotationProcessor dans gradle:

kapt "android.arch.persistence.room:compiler:1.0.0-alpha4"

Tha dernière chose à faire était de créer un immuable classe de données:

@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
)

Mise à JOUR:

Cette solution fonctionne lorsque vous avez des classes pour le modèle et les classes de Base de données dans le même Android Module. Si vous avez des classes de modèle dans Android module de la Bibliothèque et le reste du code dans votre module principal, la Salle ne les reconnaît PAS.

29voto

evanchooly Points 4732

vous devez spécifier un constructeur secondaire comme ceci:

 @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)
}    
 

14voto

stevenwood Points 116

Ce qui a fonctionné pour moi:

 @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
)
 

12voto

Erik B Points 999

Kotlin autorise aussi longtemps qu'un nom de paramètre, mais cela ne fonctionnera pas si room génère du code Java.

5voto

tito Points 41

Je pense qu'une bonne option pour le résoudre est:

 @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
)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X