2011-12-08 3 views
4

나는 추상적 인 엔티티 A를 보유하고 있으며 상위 엔티티 A가 엔티티 A 인 두 개의 엔티티도 있습니다. 각 하위는 다른 엔티티와 다른 관계를 가지고 있습니다.핵심 데이터 상위 엔티티

isPublic 부울 값이 YES 인 엔티티 A의 모든 하위 엔티티를 가져 오려고합니다.

나는 페칭과 관련하여 과거에 서브 클래 싱 된 엔티티를 가져 오는 데 어려움을 겪었으며, 나는 올바르게 수행하지 않을 것이라고 확신한다. 엔티티 C • 는 "제"

모든시와 글 하위 문서이며, 엔티티 B • 는 "시"이며, 엔티티 A • 는 "문서"입니다 :

그래서 우리는 예를 들어 말할 수 문서에는 isBookmarked라는 속성이 있습니다. suer는시 또는 기사를 북마크에 추가 할 수 있으며 북마크 된 모든 문서를 가져 오는 방법이 필요합니다. 엔티티 B와 C는 자신이 소유 한 다른 관계로 인해 독립적이어야합니다.

최적의 코어 데이터 및 UITableView 성능을 위해 NSFetchedResultsController를 사용하고 싶습니다.시와 기사가 혼합되어있는 것을 가져 오는 데 어려움을 겪고 있습니다.

어떤 가져 오기 요청을 통해 나에게시와 기사가 혼합 되었습니까?

enter image description here

+0

NSManagedObject를 서브 클래 싱하는 것이 일상적이지만, 적어도 제한된 경험으로는 아니지만 * 해당 엔티티를 순차적으로 서브 클래 싱하는 것을 들어 본 적이 없습니다. 정말로해야합니까? 당신은 단지 문서의 유형을 식별 할 수있는 속성을 가진 엔티티 문서를 가질 수 있습니까 (예를 들어, 기사의 경우 1,시의 경우 2, 소설의 경우 3 등) 및 다른 문서와의 일대 다 관계, 책갈피를 나타내는가? 그런 다음 fetchRequest 술어는 int 속성마다 원하는 문서 유형을 지정할 수 있습니다. – Wienke

+0

예 아이 엔티티 각각과 관계가 있기 때문에 별도의 엔티티가 필요합니다. 예를 들어 노트는 사용자를 참조 할 수 있지만 기사는 작성자가 아닌 새로운 대행사를 참조 할 수 있습니다 ... 단지 예제 – Daniel

+0

글쎄, 여기 있습니다 그것은 몇 가지 팁과 함께 할 수 있다고 제안하는 게시물입니다 : [http://stackoverflow.com/questions/4508451/core-data-inheritance-is-it-ok-to-do-this]. – Wienke

답변

4

하는 방법 (isBookmarked 부울 있다고 가정)이 같은 간단한 뭔가에 대해 : 당신이 서브 클래스을 가져온 확인 할

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:context]; 
// This may not be the most elegant way of using a boolean in a predicate, but… 

NSNumber *numIsBookmarked = [NSNumber numberWithBool:YES]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isBookmarked == %@", numIsBookmarked]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

[request setEntity: entityDescription]; 
[request setPredicate: predicate]; 
[request setResultType: NSManagedObjectResultType]; 

NSError *error = nil; 
NSArray *results = [contextMain executeFetchRequest:request error:&error]; 

if (error) 
{ 
    // deal with the error 
} 

[request release]; 

후 :

for (NSManagedObject *obj in results) 
{ 
    if ([obj isKindOfClass:[Poem class]]) 
    { 
     // do whatever 
    } 
    else if ([obj isKindOfClass:[Article class]]) 
    { 
     // do whatever 
    } 
} 

가 (또는 하위 클래스 MO 중 몇 개가 동일한 메소드를 구현하는 경우 respondsToSelector: 테스트를 수행하는 것이 더 효율적일 수 있습니다.)

그래도 작동하지 않습니까? 그냥 그렇지 않으면 당신은 당신이 그것을 추상적이다 말했듯이 비해야한다는 A 법인의 결과를 받게됩니다

[request setIncludesSubentities:YES]; 

을 추가하는 경우

+0

정확히 NSFetchedResultsController 아니지만 그 방법입니다. NSManagedObject의 부모 클래스로 fetchRequest를 만드는 것은 아무 문제가 없습니다. 추상적 부모조차해야합니다. –

5

Wienke의 대답은 작동합니다.

+1

안녕하세요, 감사합니다. 아마도이 질문에 뛰어 들어서는 안되었지만 경험이 많은 포스터 덕분에 이제는 추상 작업을 수행하는 방법을 알게되었습니다.(죄송합니다, Daniel, 물을 muddying.) – Wienke

+0

@ 대니얼 이것은 확실히 올바른 대답이며 받아 들여야합니다. – Joe

관련 문제