【发布时间】:2019-09-24 00:04:11
【问题描述】:
我有几个从服务器定期更新的表(Benefit、Branch、Coupon)和另外两个仅本地的表(FavoriteBenefit、UsedCoupon)。 ER图如下所示:
每当在服务器上删除Benefit 时,我还想从FavoriteBenefit 中删除适当的实体。为此,我可以使用onDelete = ForeignKey.CASCADE,并且每当数据库中不再存在父Benefit 时,FavoriteBenefit 也会被删除。听起来不错。
每当我使用时就会出现问题
@Insert(onConflict = OnConflictStrategy.REPLACE) 更新数据库中的福利。 REPLACE 实际上执行了 DELETE 和 INSERT 但 DELETE 在内部触发 onDelete 或 FavoriteBenefit,因此,该表中的所有数据也会被删除。
(Coupon 和 UsedCoupon 表也会出现类似问题。)
我正在寻找一种在事务结束之前暂时禁用外键约束的方法。也就是说,不要在交易期间验证外键,而只在交易结束时验证。 我仍然希望 Room 自动删除没有有效父级的实体。
似乎通过在@ForeignKey 定义上设置deferred = true 来标记foreign key as defferred 应该完全符合我的目标。
布尔延迟()
外键约束可以推迟到事务完成。如果您在单个事务中对数据库进行批量插入,这很有用。默认情况下,外键约束是即时的,但您可以通过将此字段设置为 true 来更改它。
但即使我设置了deferred 标志,它似乎也没有效果,因为FavoriteBenefit 仍然每次都被删除。
我对 deferred 标志的理解有误吗?
【问题讨论】:
标签: android foreign-keys android-room deferred