房间持久性:错误:实体和Pojos必须有一个可用的公共构造函数

我正在将一个项目转换为Kotlin,我试图让我的模型(这也是我的实体)的一个数据类,我打算使用Moshi从API转换JSON响应

@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必须有一个可用的公共构造函数。 你可以有一个空的构造函数或者一个构造函数,它们的参数匹配字段(按名称和类型)。 错误:找不到字段的setter。

我发现的例子不是很远

想法如何解决?

之前有过类似的问题。

首先我已经更新/添加apply plugin: 'kotlin-kapt'到gradle。

接下来,我使用它来代替gradle中的annotationProcessor

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 ) 

你需要像这样指定一个二级构造函数:

 @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://issuetracker.google.com/issues/62851733

我发现这是@关系的投影错误! 不是Kotlin语言的问题。 基于谷歌GithubBrowserSample的Java也发生错误,但不同的错误消息。

下面是我的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() ) 

对:

 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 )