如何解决Android Room:创建一对一的关系实体
我正在创建一个包含Room和三个表(作业,标签,类别)的小项目。
本质上:
- 作业属于(或具有)1个且仅一个类别,但一个作业可以具有0..N个标记。
- 一个类别有0..N个工作。
- 标签有0..N个工作。
我在尝试对所有数据建模时遇到一些麻烦,尤其是在涉及实体之间的关系时。更具体地说,我有:
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
班:
@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
)
谢谢!
解决方法
嗨,您应该像这样对数据库建模:
- 工作类别
- 标签
- 工作(添加category_id字段并向Category表添加1个外键引用)
- Job_Tags(添加tag_id,job_id字段并添加2个引用Category和Jobs表的外键)
@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,childColumns = ["tagId"]),ForeignKey(entity = JobEntity::class,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,)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。