Я использую пример приложения Apple CoreDataBooks
в качестве основы для вытягивания данных во вторичный контекст управляемого объекта в фоновом режиме, а затем слияние этих данных в первичный управляемый объект контекст.Нелегальная попытка установить связь «xyz» между объектами в разных контекстах
Данные, которые я вытягиваю, являются объектами Book
с отношением к одному с объектом Owner
(так называемый «владелец»). Объект Owner
имеет отношение «многие» к Book
(так называемые «книги»).
Мои данные представляют собой XML-документ в виде:
<Owner>
<Name>alexpreynolds</Name>
<ID>123456</ID>
</Owner>
<Books>
<Book>Book One</Book>
<Book>Book Two</Book>
...
<Book>Book N</Book>
</Books>
Book One
Book N
через ассоциированы с одним Owner
("alexpreynolds, 123456"
).
Я разобрал это в примере Owner
и NSMutableSet
, составленном из Book
экземпляров.
Когда я пытаюсь сэкономить в первый раз, он сохраняет штраф, и объединенные данные отображаются в виде таблицы.
Во втором сохранении, однако, когда содержимое XML содержит новую книгу, оно не работает.
Вот что происходит:
Я затем попытаться загрузить в документ XML, который содержит новый Book
уже не в контексте основного управляемого объекта. В новом Book
используется тот же Owner
, что и для других Book
с.
У меня есть процедуры, которые забрать этот уникальный Owner
управляемый объект (который я уже есть в моей основной контекст управляемого объекта) и уникальный Book
, который не найдены в первичном МОС.
Исходя из этого, я создаю новый Book
объект на вторичном MOC, и я поставил его «owner
» отношений, чтобы указать на уникальную Owner
я нашел в первичных МОС.
Когда я сохранить, я получаю следующее сообщение об ошибке:
*** Terminating app due to uncaught
exception 'NSInvalidArgumentException',
reason: 'Illegal attempt to establish a
relationship 'owner' between objects in
different contexts
(source = <Book: 0x7803590>
(entity: Book; id: 0x7802ae0 <x-coredata:///
Book/t527F06B2-3EB5-47CF-9A29-985B0D3758862>
; data: {
creationDate = 2009-10-12 06:01:53 -0700;
name = nil;
nameInitial = nil;
operations = (
);
owner = nil;
type = 0;
}) ,
destination = <Owner: 0x78020a0> (entity:
Owner; id: 0x3a56f80 <x-coredata://043AF2F0-1AD0-
4078-A5E8-E9D7071D67D1/Owner/p1> ; data: {
books = "<relationship fault: 0x7801bf0 'books'>";
displayName = alexpreynolds;
ownerID = 123456;
}))'
Как создать новый Book
объект на вторичном MOC, так что я все еще могу связать его с уже существующим Owner
в первичной MOC?
Спасибо за это! Я работал с Core Data в фоновом потоке GCD, поэтому должен был быть фон NSManagedObject, который я забыл использовать для вставки родительского объекта, поэтому он использовал основной поток NSManagedObject! В любом случае, спасибо! :) – runmad