Основные данные NSBatchDeleteRequest, как представляется, оставляет объекты в контексте

Я видел много вопросов относительно пакетного удаления в Core Data, но ни один из них не касается моей проблемы.

Я создаю приложение iOS 9 / Swift с использованием Core Data. На WWDC в этом году я посетил сессию Core Data и увидел, что я могу использовать NSBatchDeleteRequest для удаления большого количества объектов непосредственно из постоянного хранилища. Это работает для меня для некоторых объектов, но не для других, и я думаю, что это имеет какое-то отношение к моим отношениям.

У меня есть объектный граф, состоящий из Subject и Course , где есть отношение «один ко многим». Субъекты могут владеть как можно большим количеством курсов.

Существует отношение «курсы» к Subject с правилом удаления Cascade , так как я хочу, чтобы все курсы, связанные с subject были удалены при удалении subject .

Обратный «субъект» на Course , с правилом удаления Nullify . Здесь я немного запутался в отношении описания Apple Nullify :

Удалите взаимосвязь между объектами, но не удаляйте ни один объект. Это имеет смысл только в том случае, если отношения отдела для сотрудника являются необязательными или если вы гарантируете, что вы установите новый отдел для каждого из сотрудников до следующей операции сохранения.

Это делает его довольно ясным, но почему отношения будут удалены, но не любой объект? Если я удалю Course , я бы хотел, чтобы этот Course был удален, а связь между subject и course была удалена, чтобы ошибка в удаленном Course не отображалась в NSSet для набора Subject .

Я хочу предоставить путь для удаления всех объектов в сущности. Когда я пытаюсь это сделать, индивидуально выбирая и удаляя каждый course , courses удаляются и удаляются из NSSet courses по Subject .

Поскольку я понятия не имею, сколько courses будет присутствовать, и я хочу обеспечить высокую производительность в любой ситуации, я решил, что я бы использовал пакетное удаление, чтобы удалить все courses . Проблема заключается в том, что при использовании NSBatchDeleteRequest для удаления всех NSBatchDeleteRequest работает отлично, удаляя все courses по пути (из-за правила Cascade ), пытаясь удалить все Courses используя этот метод, кажется, оставляет все объекты на месте.

Я использовал NSBatchDeleteRequest для удаления всех Courses , но затем, когда я запрашиваю MOC чтобы узнать, какие Subjects и Courses все еще существуют, оба Courses все еще возвращаются, и у Subject владеющего ими, все еще есть ссылки на них.

Напротив, когда я выбираю и удаляю каждый Course отдельно, моя последующая выборка правильно отображает пустой массив для всех Courses и отношения «курсы» на Subject похоже, были правильно изменены.

Да, я сохраняю контекст после выполнения запроса. Я полагаю, что контекст не может быть уведомлен о том, что делает магазин, но затем снова удалял все subjects отлично работали. Что здесь происходит?

На сессии WWDC 2015, которая описывает NSBatchDeleteRequest было объяснено, что «Изменения не отражаются в контексте ». Так что вы видите, это нормально. Пакетные обновления работают непосредственно с постоянным файлом хранилища, а не через контекст управляемого объекта, поэтому контекст не знает о них. Когда вы удаляете объекты, выбирая и удаляя, вы работаете через контекст, поэтому он знает об изменениях, которые вы делаете (на самом деле он выполняет эти изменения для вас).

Если вы используете NSBatchDeleteResultTypeObjectIDs , вы можете объединить результаты пакетного удаления в свой контекст, используя mergeChangesFromRemoteContextSave:intoContexts: для обновления ваших контекстов. Вероятно, вы также можете использовать reset , если у вас нет других управляемых объектов, загруженных из контекста.

В итоге я добавил следующее, чтобы позаботиться о контексте после пакетного удаления.

  [self.managedObjectContext refreshAllObjects]; 
  • Удаление основных объектов данных из определенного раздела
  • Основные данные: «NSObjectInaccessibleException» при попытке удалить.
  • NSFetchedResultsController всегда не возвращает строк
  • Core Data SQLite store становится только после обновления
  • Ошибка CoreData с выбранным свойством в контексте дочернего управляемого объекта
  • Какой объект возвращается с помощью запроса Fetch в основных данных?
  • Предупреждения в Google Analytics для iOS
  • Основные данные для предварительно загруженной информации
  • Как добавить дополнительные атрибуты в существующий основной объект данных?
  • Оператор Core Data + 'все еще активен'
  • Удалить правила для отношений «один-на-один»
  • Давайте будем гением компьютера.