首页 > 解决方案 > 使用数据类插入对象

问题描述

我正在学习 kotlin,在 db 中插入原始类型非常容易。这是我的学生数据类的声明方式。

@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>
                       ) {}

Homework并且Attendance都是另一个包含各种原始类型的数据类;这是我的Homework数据类

@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,所以我以前在学生班中使用带有 ArrayList 作业和出勤的 POJO 对我来说不是问题,所以我对 Room 也有同样的期望。看来我在这里遗漏了一些东西.

标签: kotlinandroid-room

解决方案


Room 不支持对其他复杂对象的引用。关于这个决定的推理有一篇文章。

关键要点: Room 不允许实体类之间的对象引用。相反,您必须明确请求您的应用程序需要的数据。

您可以对房间做的所有事情就是定义一个@ForeignKey约束,这在此处记录


推荐阅读