2013-06-20 3 views
0

EntityB라는 다른 엔터티 (1--1 관계가 아닌)와의 관계가 포함 된 EntityA라는 엔터티가 있습니다. EntityB를 만들면 EntityB 인스턴스가 자동으로 하나가됩니다. 만들어진.Coredata 관계 생성

가능합니까?

또한 CoreData 모델 버전 관리를 사용하고 있습니다. 다음 버전에서는이 새로운 엔터티 (EntityB)를 EntityA에 도입했습니다. 문제는 이전에 entityB가 작성되지 않았으므로 개체 EntityA를 저장할 수 없다는 것입니다.

DB 스키마에서 EntityB를 추가하는 CoreData 병합 중에이 새로운 관계가 만들어 질 가능성이 있습니까?

도움을 주셔서 감사합니다.

티에리

답변

0

첫 번째 질문에 대답하기 위해, 당신은 자동으로 하나 개 설치를 EntityA의 didAwakeFromInsert 방법의 관계를 만들 논리를 추가하여 EntityB를 만들 수 있습니다.

두 번째 문제는 비슷한 방식으로 처리해야한다고 생각합니다. 당신이 할 수있는 일은 EntityB와의 관계의 존재를 검사하고 그것이 존재하지 않으면 EntityB를 생성하기 위해 EntityA의 didAwakeFromFetch 메소드에 로직을 추가하는 것입니다.

0

올바른 방법은 생성 된 NSManagedObject 하위 클래스에서 관계를 설정하는 것입니다. mogenerator (http://rentzsch.github.io/mogenerator/)라는 도구를 확인해 주시면 핵심 데이터 엔티티 하위 클래스에 추가하는 모든 사용자 정의 코드를 손실하지 않고도 핵심 데이터 모델을 지속적으로 변경할 수 있습니다. 코어 데이터 엔티티를 처리하기 위해 작성한 사용자 정의 코드를 손상시키지 않으면 서 모델을 변경할 때마다 새로운 하위 클래스를 자동으로 생성하도록 Mogenerator를 설정할 수 있습니다. 핵심 데이터를 진지하게 사용하려는 경우 시간 투자를 통해 가치를 발견 할 가치가 있습니다.

이러한 파일을 수동으로 생성하려면 (mogenerator없이) Xcode의 코어 데이터 모델 파일을 클릭하고 하위 클래스를 만들고자하는 엔티티를 선택하고 '편집자'메뉴를 클릭 한 다음 'Create NSManagedObject Subclass ... '

이렇게하면 EntityA.h 및 EntityA.m (또는 메뉴 항목을 클릭 할 때 선택한 엔터티에 따라 EntityB)이라는 두 개의 파일이 만들어집니다. 다른 엔티티가 파일을 생성하기 위해 동일한 프로세스를 다시 수행하십시오 (주 : 이러한 파일을 생성하기 전에 관계 설정을했는지 확인하십시오. 그렇지 않으면 다시 생성해야합니다).

그때 보통이 같은 클래스 메소드를 만듭니다

//In EntityA.h 
//between @interface and @end... 
+ (EntityA*)createNewEntityAInContext:(NSManagedObjectContext*)context; 


//In EntityA.m 
+ (EntityA*)createNewEntityAInContext:(NSManagedObjectContext*)context 
{ 
    EntityA* aEntityAObject = [NSEntityDescription insertNewObjectForEntityForName:@"EntityA" inManagedObjectContext:context] 

    EntityB* aEntityBObject = [EntityB createNewEntityBInContext:context]; 
    aEntityAObject.entityBLink = aEntityBObject; 

    return aEntityAObject; 
} 


//In EntityB.h 
//between @interface and @end... 
+ (EntityB*)createNewEntityBInContext:(NSManagedObjectContext*)context; 

//In EntityB.m 
+ (EntityB*)createNewEntityBInContext:(NSManagedObjectContext*)context 
{ 
    EntityB* aEntityBObject = [NSEntityDescription insertNewObjectForEntityForName:@"EntityB" inManagedObjectContext:context] 

    return aEntityBObject; 
} 

을 그런 다음 호출 할 수 있습니다 + createNewEntityAInContext : 새 객체를 원하고 관계가 자동으로 생성 될 때마다 방법.

다른 질문에 대해서는 사용자 지정 핵심 데이터 마이그레이션 정책이라고합니다. 당신은 구글에서 그 주제에 대한 자습서를 검색 할 수 있고 많은 링크가 있습니다. 언뜻보기에 꽤 잘 어울리는 것을 찾았습니다. http://9elements.com/io/index.php/customizing-core-data-migrations/