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

时间:2018-05-09 13:39:08

标签: android kotlin android-room

我收到两个错误

  • 错误:使用@Relation注释的字段不能是构造函数参数。构造对象后将获取这些值。

  • 错误:使用@Relation注释的字段不能是构造函数参数。构造对象后将获取这些值。

我有两张桌子。一个是任务表,另一个是子任务表。对于任务表的每个实体,都有一些子任务表实体。

所以我试图获得所有任务和单个任务的子任务列表

道:

@Query("Select * from TaskTable")
fun getTasks():List<TaskModel>

TaskModel:

class TaskModel(
        @Embedded
        var taskTable: TaskTable,

        @Relation(parentColumn = "id",
                entityColumn = "taskId")
        var subTaskTable: List<SubTaskTable>
)

TaskTable:

@Entity
data class TaskTable(
    @PrimaryKey(autoGenerate = true)
    var id:Int = 0,
    var taskListId:Int = 0,
    var title: String,
    var details:String?
)

SubTaskTable:

@Entity
data class SubTaskTable (
    @PrimaryKey(autoGenerate = true) var id: Int = 0,
    var taskId: Int = 0,

    var title: String,
    var details: String?)

的build.gradle

//room
def room_version = "1.1.0"
implementation "android.arch.persistence.room:runtime:$room_version"
kapt "android.arch.persistence.room:compiler:$room_version"
// Test helpers
testImplementation "android.arch.persistence.room:testing:$room_version"

我申请 kotlin-kapt 插件

帮我解决这个问题。我搜索堆栈溢出并实现一些答案,但这不是固定的。

2 个答案:

答案 0 :(得分:7)

嗯,它说它们不应该是构造函数参数,所以尝试使它们不是构造函数参数。

class TaskModel() {
    @Embedded
    lateinit var taskTable: TaskTable

    @Relation(parentColumn = "id",
              entityColumn = "taskId")
    lateinit var subTaskTable: List<SubTaskTable>
}

答案 1 :(得分:0)

在我的情况下,我使用annotationProcesso代替了kapt,并且存在旧版的room,请检查room的最新版本

kapt“ androidx.room:room-compiler:2.2.5”