Android Room:创建一对一关系实体

Android Room: Creating a one-to-one relationship entity

我正在创建一个带有 Room 和三个表(工作、标签、类别)的小项目。

本质上:

我在尝试对所有数据建模时遇到了一些问题,尤其是在涉及实体之间的关系时。更具体地说,我有:

fun JobListing.toJobEntityList(): List<JobEntity> {
    val jobEntityList = mutableListOf<JobEntity>()
    this.jobs.take(50).forEach { job: Job ->
        jobEntityList.add(
            JobEntity(
                jobId = job.id,
                title = job.title,
                url = job.url,
                companyName = job.companyName,
                jobType = job.jobType,
                publicationDate = job.publicationDate,
                relocation = job.candidateRequiredLocation,
                salary = job.salary
            )
        )
    }
    return jobEntityList
}

当我从网络中获取数据时会调用此扩展函数,因此我可以将其转换为实体并将它们存储在我的数据库中。 我实质上是在创建一个 JobEntity,但一个作业应该有 1 个类别和 0..N 个关联的标签。问题是我不知道如何添加与工作及其类别和标签之间的关系相关的数据。

这是我的 JobEntity class:

@Entity(
    tableName = "Jobs",
    indices = [
        Index("id", unique = true)
    ]
)
data class JobEntity(
    @PrimaryKey @ColumnInfo(name = "id") val jobId: Int,
    @ColumnInfo(name = "title") val title: String,
    @ColumnInfo(name = "url") val url: String,
    @ColumnInfo(name = "company_name") val companyName: String,
    @ColumnInfo(name = "job_type") val jobType: String,
    @ColumnInfo(name = "publication_date") val publicationDate: String,
    @ColumnInfo(name = "candidate_required_location") val relocation: String,
    @ColumnInfo(name = "salary") val salary: String
)

提前致谢!

您好,您应该像这样对数据库建模:

  1. Job_Category
  2. 标签
  3. 职位(添加 category_id 字段并添加 1 个引用类别 table 的外键)
  4. Job_Tags(添加 tag_id、job_id 字段并添加 2 个引用类别和职位的外键 tables)

@Entity(tableName = "Category")
data class CategoryEntity(
    @PrimaryKey @ColumnInfo(name = "id") val id: Int,
)

@Entity(tableName = "Tags")
data class TagEntity(
    @PrimaryKey @ColumnInfo(name = "id") val id: Int,
)

@Entity(
    tableName = "Jobs",
    foreignKeys = [ForeignKey(entity = CategoryEntity::class, parentColumns = ["id"], childColumns = ["categoryid"])]
)
data class JobEntity(
    @PrimaryKey @ColumnInfo(name = "id") val id: Int,
    @ColumnInfo(name = "categoryid", index = true) val categoryid: Int,
    // ... other fields
)
@Entity(
    tableName = "JobTags",
    foreignKeys = [
        ForeignKey(entity = TagEntity::class, parentColumns = ["id"], childColumns = ["tagId"]),
        ForeignKey(entity = JobEntity::class, parentColumns = ["id"], childColumns = ["jobId"]),
    ]
)
data class JobTagEntity(
    @PrimaryKey @ColumnInfo(name = "id") val id: Int,
    @ColumnInfo(name = "tagId", index = true) val tagId: Int,
    @ColumnInfo(name = "jobId", index = true) val jobId: Int,
)