Как правильно каскадно удалять управляемые объекты в Core Data? - PullRequest
15 голосов
/ 23 января 2010

У меня есть модель базовых данных, которая имеет три объекта: A, B и C. A имеет отношение один ко многим с B, а B имеет отношение многие ко многим с C. Правило удаления для A -> B - это «Каскад», а B -> A - это «Никаких действий». Правило удаления для B -> C - «Без действий», а C -> B - «Запретить».

У меня проблемы с выполнением удаления объекта A. То, что я хочу, чтобы произошло следующее:

  1. Я удаляю экземпляр A (используя deleteObject:)
  2. Удаление распространяется на любые B, связанные с A (из-за правила удаления "Cascade")
  3. Все B, связанные с A, удалены
  4. Любые отношения, принадлежащие C, чьи связанные B были удалены, также удаляются

Это может немного сбивать с толку, поэтому позвольте мне перефразировать: когда A удалено, удалите все связанные с ним буквы B. И любые C, которые ссылаются на эти B, больше не должны ссылаться на них.

В моем тестировании я не вижу, чтобы у меня вообще работало правило удаления "Каскад". Когда я удаляю A, я сразу после этого вызываю processPendingChanges (просто чтобы убедиться, что удаление было сделано). Затем я сравниваю количество A и B, которые были в NSManagedObjectContext до удаления и после него. Экземпляр A был должным образом удален (общее количество A теперь на единицу меньше, чем до удаления). Тем не менее, количество B остается неизменным. Таким образом, похоже, что правило удаления «Каскад» не соблюдается.

Я знаю, что могу вручную пройти через отношение A -> B и вручную удалить каждый B. Однако, похоже, что Core Data предоставляет это бесплатно, поэтому я не хочу этого делать, если Core Data не недостаточно. Любая информация, касающаяся использования правил удаления "Cascade", приветствуется.

Ответы [ 2 ]

16 голосов
/ 23 января 2010

Я, конечно, не эксперт по основным данным, но, читая документацию по различным параметрам правил удаления , мне кажется, что вы хотите, чтобы отношение B -> C было Обнулить вместо Нет действий . Возможно, Б не уходят, потому что К до сих пор хранят ссылки на них?

1 голос
/ 11 мая 2013

На основании

Любые отношения, принадлежащие C, чьи связанные B были удалены, также удалены Предполагает, что B-C также должен иметь Каскад.

Кроме того, если B удаляется, то C также должны быть удалены. Снова Каскад.

  • Обнуление часто используется в качестве правила обратного удаления *

т. Отношение Bs к A является Нулевым. Отношение C к B является недействительным. Так что, когда C удаляется, B НЕ удаляется. И когда B удаляется; А НЕ удаляется.

Как в этом выигрышном розыгрыше.

A --- >> B Каскад <---- Обнулить </p>

B --- >> C Каскад <---- Обнулить </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...