使用数据插入对象 class

Insert object using data class

我正在有空间地学习 kotlin,在 db 中插入基本类型非常容易。以下是我的学生数据 class 的声明方式。

@Entity(tableName = "student")
data class Student(@PrimaryKey(autoGenerate = true) var id: Long = 0,
                   @ColumnInfo(name="studentID") var studentID: Long = 0,
                   @ColumnInfo(name="schoolID") var schoolID: Long = 0,
                   @ColumnInfo(name="guardianID") var guardianID: String = "",
                   @ColumnInfo(name="matrixNumber") var matrixNumber: String = "",                   
                   @ColumnInfo(name="name") var name: String = "",
                   @ColumnInfo(name="homework") var homework: ArrayList<Homework>,
                   @ColumnInfo(name="attendance") var attendance: ArrayList<Attendance>
                       ) {}

HomeworkAttendance 都是另一个数据 class ,其中包含各种原始类型;这是我的 Homework 数据 class

@Entity(tableName = "homework")
data class Homework(@PrimaryKey(autoGenerate = true) var id: Long = 0,
                    @ColumnInfo(name="subject") var subject: String,
                    @ColumnInfo(name="teacher") var teacher: String,
                    @ColumnInfo(name="submissionDate") var submissionDate: String = "",
                       ) {
}

我在作业和出勤上都会收到这个编译错误

Cannot figure out how to save this field into database. You can consider adding a type converter for it.

如果重要的话,以上所有数据都将使用改造来检索。我在某处读到我需要使用 TypedConverter 是吗?但我还不是很清楚。

顺便说一句,我以前使用过 Java 和 SQLiteHelper,所以我之前在 class 学生中使用 POJO 和 ArrayList 作业和出勤不是问题,所以我期待与 Room 相同.. 看来我在这里遗漏了一些东西。

Room 不支持对其他复杂对象的引用。 reasoning about this decision.

上有一篇文章

Key takeaway: Room disallows object references between entity classes. Instead, you must explicitly request the data that your app needs.

您对空间所做的一切就是定义一个 @ForeignKey 约束,即 documented here