Основные данные: незаконная попытка установить связь + (нулевой) контекст

Я анализирую данные в фоновом потоке, вставляю новые объекты и устанавливаю отношения с другими существующими объектами.

Иногда я получаю ошибку: «пытаюсь установить связь между объектами в разных контекстах».

Прочитав больше об этом, я сейчас создаю новый ManagedObjectContect в моем фоновом потоке и использую его для вставки новых сущностей и настройки отношений. Я стараюсь использовать этот новый ManagedObjectContext только в фоновом потоке. Когда мне нужно найти существующий объект, чтобы установить связь между существующим объектом и одним из этих новых объектов, я вызываю [moc objectWithId: id], чтобы получить существующий объект, используя мой новый moc. Однако я все еще получаю сообщение об ошибке.

Разочарованный, я начал распечатывать. Я заметил, что, когда я распечатываю свойство managedObjectContext для каждого NSManagedObject, непосредственно перед установкой отношения я иногда получаю распечатанное '(null)'. Кажется, это когда возникает проблема.

Может ли кто-нибудь сказать мне, что я делаю не так? Почему у меня иногда есть (нулевые) mocs на моих объектах?

Спасибо за любую помощь, которую вы можете оказать!


person toofah    schedule 01.12.2010    source источник
comment
Невозможно диагностировать эту проблему без включения обратных трассировок и кода.   -  person Joshua Nozzi    schedule 01.12.2010


Ответы (3)


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

Объект Null, скорее всего, вызван использованием временных идентификаторов объекта. ObjectID не фиксируется до тех пор, пока объект не будет сохранен в постоянном хранилище. До тех пор у него есть временный идентификатор, который изменится при сохранении.

person TechZen    schedule 01.12.2010

Нам нужно увидеть часть вашего кода. Моей первой мыслью было бы проверить, получаете ли вы доступ к managedObjectContext через его свойство или напрямую?

Доступ к нему через свойство гарантирует, что контекст всегда доступен (т.е. не равен нулю) при создании новых управляемых объектов, при условии, что вы используете методы базовых данных шаблона, предоставленные Apple.

person Rog    schedule 01.12.2010
comment
Родж, чтобы проверить свойство managedObjectContext, я просто регистрирую [entity managedObjectContext]. Это то, что иногда возвращает '(null)'. - person toofah; 01.12.2010
comment
Не увидев вашего кода, вам будет невозможно помочь, извините! - person Rog; 01.12.2010

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

person Jonathan    schedule 01.12.2010
comment
Джонатан, новые сущности вставлены в moc. Существующие сущности, которые я пытаюсь связать, уже находятся в постоянном хранилище. - person toofah; 01.12.2010
comment
Что вам может понадобиться, так это объединить два контекста объекта. Изучите mergeChangesFromContextDidSaveNotification: NSManagedObjectContext. Также посмотрите на пример основных сборников данных и на справочник основных данных Маркуса Зары. Я считаю, что последнее стоит того, чтобы справиться с этой ситуацией. - person Jonathan; 01.12.2010