【发布时间】:2020-02-28 18:14:42
【问题描述】:
我已经阅读了大量关于房间和外键的问答和文章,我几乎确信我实际上无法实现我想要做的事情。此外,大多数示例/教程仅解释选择查询。
所以,有一个经典的一对多关系,我想用@Embedded 和@Relation 定义一个对象,以获得包含对象列表的对象的“一次性”插入方法。 为了更清楚:
许可证:
@Entity(tableName = "licence")
data class Licence(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "licence_id")
var licenceId: Int,
@ColumnInfo(name = "expiration_date")
var expirationDate: Date
//other attributes )
许可证配置:
@Entity(
foreignKeys = [
ForeignKey(
entity = Licence::class,
parentColumns = ["licence_id"],
childColumns = ["licence_reference"],
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.CASCADE
)],
tableName = "licence_configurations")
data class LicenceConfig(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "licence_config_id")
var licenceConfigId: Int,
@ColumnInfo(name = "licence_reference")
var licenceId: Int
//other attributes )
LicenceWithConfigurations
data class LicenceWithConfigurations(
@Embedded
val licence: Licence,
@Relation(
parentColumn = "licence_id",
entityColumn = "licence_reference",
entity = LicenceConfig::class)
val licenceConfig: List<LicenceConfig>?)
我要做的是避免@Transaction 并为许可证执行第一次插入,检索 id,为每个许可证配置设置 id 并执行另一次插入。 相反,我想在 DAO 中使用类似的方法:
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertLicenceWithConfigurations(licenceWithConfigurations: LicenceWithConfigurations)
现在错误是“FOREIGN KEY 约束失败(代码 787 SQLITE_CONSTRAINT_FOREIGNKEY)”,所以我为 LicenceConfig 类指定了@Index,然后尝试在另一个字段上设置外键(因为我已经阅读了自动生成的 id 为外键它不起作用)但仍然不起作用。我可以这样做还是应该返回 @Transaction 并手动处理插入?
【问题讨论】:
标签: android kotlin android-room