문제

나는 애플을 사용하고있다 CoreDataBooks 샘플 응용 프로그램은 백그라운드에서 데이터를 보조 관리 된 객체 컨텍스트로 끌어 당긴 다음 해당 데이터를 기본 관리 된 객체 컨텍스트로 병합합니다.

내가 당기고있는 데이터는 a입니다 Book An과의 관계를 가진 엔티티 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").

나는 이것을 an에 구문 분석하고있다 Owner 인스턴스 및 an NSMutableSet 로 구성 Book 인스턴스.

처음으로 저장하려고하면 잘 저장되고 합병 된 데이터가 테이블보기에 나타납니다.

그러나 두 번째 저장에서 XML 컨텐츠에 새 책이 포함되어 있으면 작동하지 않습니다.

다음은 다음과 같습니다.

그런 다음 새로운 기능이 포함 된 XML 문서에로드하려고합니다. Book 기본 관리 객체 컨텍스트에는 아직 없습니다. 새로운 Book 동일하게 사용하고 있습니다 Owner 다른 사람과 관련이 있습니다 Book에스.

나는이 독특한 것을 선택하는 루틴이 있습니다 Owner 관리 객체 (이미 기본 관리 객체 컨텍스트에 이미 가지고 있음) 및 고유 한 Book 그건 ~ 아니다 기본 MOC에서 발견됩니다.

이것으로부터 나는 새로운 것을 만듭니다 Book 2 차 MOC의 객체를 설정하고 "owner"독특한 것을 가리키는 관계 Owner 나는 1 차 MOC에서 발견했다.

저장하면 다음 오류가 발생합니다.

*** 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 2 차 MOC의 엔티티, 내가 여전히 존재하는 것과 연관시킬 수 있도록 Owner 1 차 MOC에서?

도움이 되었습니까?

해결책

다른 관리 객체 컨텍스트에서 객체간에 관계가있을 수 없습니다. 따라서 주변을 돌아 다니는 한 가지 방법은 객체를 관리되는 객체 컨텍스트로 가져 오는 것입니다.

예를 들어:

NSManagedObject *book = // get a book in one MOC
NSManagedObject *owner = // get an owner in a different MOC
[[owner mutableSetValueForKey:@"books"] addObject:[owner.managedObjectContext objectWithID:[book objectID]]];

그래서 당신이하는 일은 실제로 가져 오는 것입니다 Book 동일한 관리 객체 컨텍스트로 owner. 그러나 이것은 가능하다는 점을 명심하십시오. book 이미 저장되었습니다. 관리되는 객체 컨텍스트는 영구 저장소에서 객체를 찾을 것이므로 먼저 저장해야합니다.

다른 팁

나는 같은 문제가 있었고이 문장은 오류를 해결하는 데 도움이되었습니다.

다른 관리 객체 컨텍스트에서 객체간에 관계가있을 수 없습니다. 따라서 주변을 돌아 다니는 한 가지 방법은 객체를 관리되는 객체 컨텍스트로 가져 오는 것입니다.

내 코드는 다음과 같습니다 (변수가 당신을 위해 작동하도록 변수를 대체했습니다).

// Have the owner object and get the managedObjectContext
Owner *owner = [[DataFunctions alloc] getCurrentOwner];
NSManagedObjectContext *context = [owner managedObjectContext]; 

// Create a book and use the manageObjectContext of owner
Book *book = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context];
[newQuote setValue: "Book Title" forKey:@"title"];
[newQuote setOwner:owner];

이게 도움이 되길 바란다 :)

여기서, 당신은 다른 컨텍스트로 가져 오거나 생성되는 두 객체 사이의 관계를 설정하려고합니다. 핵심 데이터는 그러한 관계를 설정할 수 없습니다. 이를 달성하려면 ObjectID와 함께 첫 번째 객체의 컨텍스트와 함께 두 번째 객체 (관계를 만들려고합니다)를 가져와야합니다. 이제이 두 개체 사이의 관계를 설정할 수 있어야합니다. 예를 들어:

MagicalRecord.saveWithBlock({[unowned self] (localContext: NSManagedObjectContext!) in

    let user = User.MR_createEntityInContext(localContext)!
    .....
    .....
}) //here local context stores data on end of block itself

MagicalRecord.saveWithBlock({[unowned self] (localContext: NSManagedObjectContext!) in

    let address = Address.MR_createEntityInContext(localContext)!
    .....
    .....
    let user = localContext.objectWithID(self.user!.objectID) as! User
    user.address = address
})

이것이 당신을 도울 수 있기를 바랍니다!

오류에서 알 수 있듯이, 하나의 핵심 데이터 객체에서 다른 컨텍스트에서 다른 객체로 설정된 핵심 데이터 객체에서 관계를 가질 수 없습니다. 이 문제를 해결할 수있는 한 가지 방법 owner 적절한 관계 (두 개체 모두 동일한 맥락에 있기 때문에 문제가 없습니다).

book *book = [mainContext ........]   //Get book from default context

NSManagedObjectID *objectId = [book objectID];

Book *tmpBook = [tmpContext objectWithID:objectId]; //Now book has the legal relationship

스위프트 버전 ...

context.insert(objectFromOtherContext)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top