房间持久性:错误:实体和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 )