Używam aplikacji przykładowej Apple CoreDataBooks
jako podstawy do wyciągania danych do dodatkowego obiektu zarządzanego w tle, a następnie łączenia tych danych do głównego zarządzanego obiektu kontekst.Niedozwolona próba nawiązania relacji "xyz" między obiektami w różnych kontekstach
Dane, które przeciągam to jednostka Book
z relacją jeden do jednego z jednostką Owner
(nazywaną "właścicielem"). Jednostka Owner
ma wiele relacji z Book
(zwanych "książkami").
Moje dane jest dokumentem XML w postaci:
<Owner>
<Name>alexpreynolds</Name>
<ID>123456</ID>
</Owner>
<Books>
<Book>Book One</Book>
<Book>Book Two</Book>
...
<Book>Book N</Book>
</Books>
Book One
przez Book N
są związane z jednym Owner
("alexpreynolds, 123456"
).
ja parsowania to pod instancji Owner
i NSMutableSet
składa się z Book
przypadkach.
Kiedy próbuję zapisać za pierwszym razem, zapisuje się dobrze, a połączone dane pokazują się w widoku tabeli.
W przypadku drugiego zapisu, gdy zawartość XML zawiera nową książkę, nie działa.
Oto co się dzieje:
ja spróbuje załadować w dokumencie XML, który zawiera nową Book
nie już w pierwotnym kontekście zarządzanego obiektu. Nowy Book
używa tego samego Owner
jako tego, który jest powiązany z innymi Book
s.
Mam procedury, które wybierają ten wyjątkowy Owner
zarządzanego obiektu (które już mam w moim pierwotnym kontekście zarządzanego obiektu) oraz unikalny Book
który jest nie znaleźć w pierwotnej MOC.
Z tego, tworzę nową Book
obiekt w średnim MOC i ustawić jej „owner
” związek, aby wskazać unikalnego Owner
znalazłem w podstawowej MOC.
Kiedy zapisać, pojawia się następujący błąd:
*** 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;
}))'
Jak utworzyć nowy Book
podmiot we wtórnym MOC, tak, że mogę nadal kojarzy się z istniejącej wcześniej Owner
w pierwotnym MOC?
Dzięki za to! Pracowałem z Core Data w wątku GCD w tle, więc musiałem mieć tło NSManagedObject, którego zapomniałem użyć do wstawienia obiektu nadrzędnego, więc używał głównego wątku NSManagedObject! W każdym razie, dzięki! :) – runmad