2015-03-10 2 views
0

Я использую sqlite для Core Data в качестве бэкэнд. Кажется, что когда вы устанавливаете 'on delete' для отношения сущности как 'cascade', данные ядра не используют бэкэнд для удаления. Основные данные упрощают удаление всех относительных данных в цикле. Это дает мне дополнительную задержку, когда я пытаюсь удалить объект с огромным количеством относительных объектов. Во-первых, он выполняет все относительные объекты ошибки, после чего удаляет их по одному. Я вижу это из журнала.«Правило удаления данных ядра» для отношений не ретранслируется на бэкэнд?

Я думал, что если я использую sqlite в качестве базы данных Core Data, правило удаления «каскада» будет выполнено с помощью sqlite «create table statement».

Я пропустил? Есть ли возможность заставить Core Data использовать каскадное удаление на базе sqlite?

UPD:

Как @Mundi предложил. Я разрешил его следующим образом:

  1. Set удалить правило «Нет действий» для лица (это называется Project) , который имеет много относительных объектов (более 10K)
  2. Продлить сущности проекта с опорой.
  3. Вместо удаления я установил Project.isDeleted 1.
  4. Всех виды фильтруются с Предикатным IsDeleted эк 0.
  5. Создайте фоновую задачу, которая запуск каждые 10 секунд (перестраиваемую) и удалить проекты с пропом isDelete эк- и его относительные объекты

фоновая задача делает удаление следующим образом: выборки

  1. Exec (IsDeleted = 1), чтобы получить проекты, чтобы удалить с setLimit эк 3 (перестраиваемого)
  2. Exec пакет извлекает все относительные объекты для удаления.
  3. Удалить все относительные объекты в цикле + сохранить после размера партии. Если здесь происходит плохое, мы можем продолжить в другом прогоне. Здесь я даже останавливаю задачу, если пользователь хочет закрыть приложение.
  4. Удалить проект и сохранить.

ответ

1

Правильные, огромные операции удаления и вставки могут быть следствием производительности. Не имеет значения, вызваны ли эти удаления правилом удаления или нет.

Лучшее решение для удаления предметов вручную «вручную». Переопределите метод willSave в подклассе подпроцессора родительского объекта, проверьте флаг deleted и удалите его сами.

Если есть много записей для удаления (проверить, сколько), вы должны быть в состоянии избавиться от проблем производительности путем удаления партий записей (может быть несколько сотен в то время) и сохранение после каждой партии.

+0

Выделение исключений - отличная идея, но имейте в виду компромиссы атомарности, присущие там. (Что произойдет, если приложение выйдет из строя через пару пакетов? Они не будут удалены.) IOS 8 имеет определенные API для решения таких проблем: http://code.tutsplus.com/tutorials/ios-8-core- data-and-batch-updates - cms-22164 –

+0

Хорошая точка.Это может быть устранено путем поиска блуждающих объектов в начале приложения для их удаления. Кроме того, я не уверен, что Core Data очистит это с помощью каскадного правила в сценарии прерывания, которое вы укажете – Mundi

+0

@ AndyRiordan Надеюсь, что я преодолел проблему с сбоями между партиями, см. Обновления. – sim

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