Android Room:创建一对一关系实体
我正在创建一个包含房间和三张桌子(作业、标记、类别)的小项目 基本上:Android Room:创建一对一关系实体,android,sqlite,entity,android-room,Android,Sqlite,Entity,Android Room,我正在创建一个包含房间和三张桌子(作业、标记、类别)的小项目 基本上: 作业属于(或具有)1且仅属于类别,但作业可以具有0..N个标记 一个类别有0..N个作业 标记有0..N个作业 我在尝试对所有数据建模时遇到了一些问题,尤其是在实体之间的关系方面。更具体地说,我有: fun JobListing.toJobEntityList(): List<JobEntity> { val jobEntityList = mutableListOf<JobEntity>
- 作业属于(或具有)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
}
提前谢谢 您好,您应该像这样对数据库建模:
非常感谢你的回答!现在的问题是,对于这个数据库模型,我如何正确地插入从网络中获取的数据?因为现在我的扩展方法
toJobEntityList
希望创建一个列表
,而每个JobEntity
都需要一个categoryId
,我认为我当时没有,你应该先插入类别,然后插入标签,然后再插入作业和标签。如果帖子有帮助,你可以接受它作为答案,那么jobtag实体的id
?它不是自动生成的吗?我得到了一个外键约束失败(代码787 SQLITE\u constraint\u FOREIGNKEY)
当插入该表时,我忘了将其标记为自动生成。但数据来自服务器。如果您的数据模型与此不同,并且没有将标记存储为实体,则可以修改。删除JobTagEntity并使用converter将标记存储为数组
@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
)
@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,
)