Сбой запроса выборки основных данных с: «NSInternalInconsistencyException», причина: «оператор все еще активен» - PullRequest
7 голосов
/ 20 июня 2010

Базовая компоновка приложения с использованием шаблона контроллера навигации с базовой датой:

Делегат: persistenceCoordinator, managedObjectModel, managedObjectContext

  • RootView: managedObjectContext (из делегата), addManagedObjectContext (с использованием шаблонаиз шаблонов), fetchResultsController
    • Представление добавления / редактирования (иерархия для добавления объекта A и его B)

У меня есть два объекта, A & Bкоторые имеют отношение 1 к 1 / обратное отношение

Используя шаблон из шаблонов, приложение:

  1. Создает addManagedObjectContext
  2. Вставляет объект A
  3. Добавляет представление «Добавить / редактировать A» (передав ему вставленную сущность)

ШАГИ ИСКЛЮЧЕНИЯ 1:

Если я просто заполняю атрибуты A и сохраняювсе работает нормально.

  • Объект вставлен в базу данных (проверено с помощью sqlite3 в командной строке)
  • fetchResultsController обновляетпредставление списка
  • Я могу закрыть и открыть приложение (полное закрытие / открытие, а не просто переключение приложения), и представление списка будет корректно восстановлено

Если я затем отредактирую A, я смогувыберите Добавить B, и представление добавления B будет включено (и передано сущность A)

  • Заполните детали B и сохраните
  • B вставлено в managedObjectContext A, отношение установленои контекст сохраняется
  • Вид всплывает и все выглядит хорошо
  • Оба объекта находятся в базе данных с правильными отношениями
  • Я могу перезагрузить запись и посмотретьотношения, вносить изменения и т. д.
  • ИСКЛЮЧЕНИЕ: Если я закрою / повторно открою приложение, чтобы вызвать выборку, произойдет ошибка, упомянутая в заголовке.

ШАГИ ИСКЛЮЧЕНИЯ2:

Если я заполню атрибуты A И атрибуты B в начальном «добавлении»

  • Сохранение B инициирует полное сохранение контекста A (как указано выше)
  • Сохранение A сохраняет через отношения делегатов, установленныеemplate (и объединяет результат в основной managedObjectContext и т. д.)
  • Объекты вставляются в базу данных правильно
  • Однако fetchResultsController НЕ обновляется для отображения новых записей
  • ИСКЛЮЧЕНИЕ: Если я закрою / снова открою приложение, чтобы вызвать выборку, произойдет ошибка, упомянутая в заголовке.

Сначала я попытался сохранить A, добавив отдельный контекст для B и т. Д.и т.д. Я запутался, если не сказать больше.Любая помощь будет принята с благодарностью.

Ура, Райан

Ответы [ 2 ]

4 голосов
/ 20 июня 2010

Звучит так, как будто у вас есть два или более контекста управляемого объекта, когда он вам нужен.

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

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

3 голосов
/ 21 июня 2010

Эта ошибка обычно связана с многопоточностью и, вероятно, означает, что что-то еще обрабатывается в другом потоке. В моем случае я делал что-то глупое в init управляемого объекта (не переопределяя init;)).

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