【问题标题】:Room kotlin: Entities and Pojos must have a usable public constructor. Stuck on this errorRoom kotlin:实体和 Pojos 必须有一个可用的公共构造函数。卡在这个错误上
【发布时间】:2018-10-19 15:47:57
【问题描述】:

我遇到两个错误

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

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

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

所以我试图从单个任务中获取所有任务和子任务列表

道:

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

任务模型:

class TaskModel(
        @Embedded
        var taskTable: TaskTable,

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

任务表:

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

子任务表:

@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 插件

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

【问题讨论】:

    标签: android kotlin android-room


    【解决方案1】:

    它说它们不应该是构造函数参数,所以试着让它们不是构造函数参数。

    class TaskModel() {
        @Embedded
        lateinit var taskTable: TaskTable
    
        @Relation(parentColumn = "id",
                  entityColumn = "taskId")
        lateinit var subTaskTable: List<SubTaskTable>
    }
    

    【讨论】:

    • 不错的解决方案,但如果我需要data class 怎么办?有没有其他方法可以解决这个问题,或者只是让 @Embedded 属性不是构造函数参数应该满足?我也更新到了 androidX,因为我读到 Room 中存在一个已知错误,修复了仅针对 androidX 发布的新版本
    • 嗯,the example in docs 是一个带有@Relation 参数的数据类,参见UserWithPlaylists。是不是搞错了?
    • @VadimKotov 不,只是我在2018.05.09写了这个答案,而从2019.06.13发布的Room 2.1.0开始支持数据类的构造函数参数(超过1年稍后),请参阅 developer.android.com/jetpack/androidx/releases/room#2.1.0 -- 感谢您指出这一点,显然现在您可以使用这样的数据类。
    • @EpicPandaForce 我现在在使用带有 Room 2.2.3 的 POJO 数据类时遇到了同样的错误。有什么问题?
    【解决方案2】:

    就我而言,我使用annotationProcesso而不是kapt,并且有旧版本的房间,请检查房间的最新版本

    kapt "androidx.room:room-compiler:2.2.5"

    【讨论】:

    • 谢谢。我问了这个问题,也许是 2 年前。我也离开了android
    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2017-11-13
    • 2020-09-03
    • 2019-09-14
    相关资源
    最近更新 更多