Android Room с отложенным внешним ключомAndroid

Форум для тех, кто программирует под Android
Anonymous
Android Room с отложенным внешним ключом

Сообщение Anonymous »

У меня есть несколько таблиц, которые периодически обновляются с сервера (, Branch, Coupon) и еще две таблицы, которые являются только локальными (

Код: Выделить всё

FavoriteBenefit
, UsedCoupon). Диаграмма ER выглядит следующим образом:
Изображение


Каждый раз, когда преимущество удаляется на сервере, я также хочу удалить соответствующий объект из 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.


Но даже когда я устанавливаю флаг отложенного, похоже, это не имеет никакого эффекта, поскольку FavoriteBenefit все равно удаляется каждый раз.

Я неправильно понимаю флаг отложенного?

Подробнее здесь: https://stackoverflow.com/questions/560 ... oreign-key

Вернуться в «Android»