2010-01-23 2 views
15

У меня есть модель Core Data, которая имеет три объекта: A, B и C. A имеет отношения «один ко многим» с B, а B имеет отношение «многие ко многим» с C. Правило удаления для A -> B - это «Каскад», а B -> A - «Нет действий». Правило удаления для B -> C - «No Action», а C -> B «Deny».Как правильно каскадировать удаленные управляемые объекты в Core Data?

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

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

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

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

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

+0

Почему вы не хотите удалить C, что ссылки B связаны с удаленным A? – Eimantas

ответ

16

Я конечно не эксперт основных данных, но чтение на documentation on the various delete rule options, мне кажется, что вы хотите, B -> C отношения быть аннулирует, а не Нет действий. Возможно, Bs не уходят, потому что Cs все еще держат ссылки на них?

+0

Вы помогли указать мне в правильном направлении. Nullify корректно удаляет ссылки. У меня все еще есть некоторые проблемы после удаления, но я считаю, что это что-то в моей логике/модели данных. –

+0

Здравствуйте, ссылка не работает. –

+0

Руководство по программированию базовых данных недавно получило некоторые довольно значительные изменения (и потеряло много контента, увы, тоже). Обновлена ​​ссылка. –

1

На основе

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

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

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

т.е.. Отношение Bs к A равно Nullify. C к B - Nulllify. Таким образом, когда C удаляется, B НЕ удаляется. И когда B удаляется; A НЕ удаляется.

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

--- >> B Cascade < ---- аннулирует

B --- >> C Cascade < ---- Отменяет

Смежные вопросы