У меня есть несколько таблиц, которые периодически обновляются с сервера (Benefit
, Branch
, Coupon
) и еще две таблицы, которые являются только локальными (FavoriteBenefit
, UsedCoupon
). Диаграмма ER выглядит следующим образом:
![ER diagram](https://i.stack.imgur.com/74jv8.png)
Всякий раз, когда Benefit
удаляется на сервере, я также хочу удалить соответствующий объект из FavoriteBenefit
. Для этого я могу использовать onDelete = ForeignKey.CASCADE
, и когда родительский элемент Benefit
больше не существует в базе данных, FavoriteBenefit
также удаляется. Звучит хорошо.
Проблема возникает всякий раз, когда я использую
@Insert(onConflict = OnConflictStrategy.REPLACE)
для обновления преимуществ в базе данных. REPLACE
фактически выполняет DELETE
и INSERT
, но DELETE
внутренне запускает onDelete
из FavoriteBenefit
, и в результате все данные в этой таблице также удаляются.
(Аналогичная проблема возникает с таблицами Coupon
и UsedCoupon
.)
Я ищу способ временно отключить ограничения внешнего ключа до конца транзакции. То есть не проверять внешние ключи во время транзакции, а только в конце транзакции.
Я по-прежнему хочу, чтобы Room автоматически удаляла объекты, у которых нет действительного родителя.
Похоже, что пометка внешнего ключа как отложенного путем установки deferred = true
в определении @ForeignKey
должна делать именно то, что я пытаюсь достичь.
boolean deferred ()
Ограничение внешнего ключа может быть отложено до завершения транзакции. Это полезно, если вы делаете массовые вставки в базу данных за одну транзакцию. По умолчанию ограничения внешнего ключа являются непосредственными, но вы можете изменить их, установив для этого поля значение true.
Но даже когда я установил флаг deferred
, это, кажется, не имеет никакого эффекта, потому что FavoriteBenefit
все еще удаляется каждый раз.
Я правильно понимаю флаг deferred
?