Взаимосвязь базовых данных, несколько контекстов и потоков управляемых объектов - PullRequest
0 голосов
/ 14 июля 2011

Это немного сложнее.

У меня есть Document сущности, которые в настоящее время импортируются в CoreData из базы данных SQLite в фоновом потоке. Для фонового потока существует отдельный контекст, и я сохраняю данные каждые 500 записей.

Сохранение контекста фонового потока вызывает уведомление, которое захватывает контексты моего основного потока и выполняет слияние между ними.

Все работает как положено, если я импортирую только document сущностей.

Моя проблема возникает, когда я пытаюсь установить связь между текущим document, который создается, другой сущностью, называемой briefcase.

Вот что сейчас делает моя процедура импорта:

  • Создать Briefcase сущность
  • Перебирает строки базы данных SQLite и создает Document сущностей для каждой строки
  • Создать связь между документом в цикле и сущностью портфеля
  • На каждые 500 строк я сохраняю и сбрасываю контекст. Это вызывает уведомление ContextSave, которое захватывает основной поток и сливается с контекстом основного потока.
  • Здесь моя проблема : после сохранения и сброса выше, моя сущность Briefcase объединяется с основным потоком, поэтому, когда мой цикл продолжается, следующая созданная сущность документа пытается связать себя с портфель, где я получаю сбой, говоря, что не могу установить отношения между объектами в отдельных потоках.

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

Итак, мой вопрос:

  • Можете ли вы придумать способ сохранения сущности портфеля (и действительной) для всего процесса импорта, чтобы я мог продолжать создавать отношения?

  • Моей первой мыслью было создать портфель без контекста, а затем добавить его в контекст после завершения всего процесса. Это не сработало очень хорошо (оно вылетело при создании).

Ваши мысли очень ценятся. Рог

1 Ответ

1 голос
/ 14 июля 2011

Отвечая на мой вопрос:

  • Создать портфель сущности
  • Цикл по строкам базы данных SQLite и создание сущностей Document для каждой строки
  • Создание связи между документом в цикле и сущностью портфеля
  • На каждые 500 строк сохраняйте контекст и сразу сохраняйте objectID для портфеля после сохранения
  • Теперь можно сбросить контекст
  • (Re) получить экземпляр портфеля, используя сохраненный выше идентификатор объекта и существующий идентификатор объекта: ошибка: метод
  • Цикл продолжается ...
...