我使用Apple的CoreDataBooks
示例應用程序作爲在後臺將數據拉入輔助管理對象上下文的基礎,然後將該數據合併到主管理對象中上下文。非法嘗試在不同的上下文中建立對象之間的關係'xyz'
我拉入的數據是一個Book
實體,與實體(稱爲「所有者」)具有一對一的關係。 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內容包含新書,則不起作用。
這裏發生了什麼:
我然後嘗試包含新Book
XML文檔中加載的主要管理對象上下文尚未。新的Book
正在使用與其他Book
相同的Owner
。
我有挑選出這種獨特的Owner
管理對象例程(我已經在我的主要管理對象上下文)和獨特的Book
是不在主MOC找到。
由此,我在輔助MOC中創建了一個新的Book
對象,並將其「owner
」關係設置爲指向我在主要MOC中找到的唯一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;
}))'
如何在二級MOC創建一個新的Book
實體,這樣我仍然可以將其與在主預先存在Owner
關聯MOC?
感謝您的支持!我正在Core Data中使用後臺GCD線程,所以必須有一個NSManagedObject的背景,我忘記了用它來插入父對象,因此它使用的是主線程NSManagedObject!不管怎樣,謝謝! :) – runmad 2011-09-25 20:38:22