2013-05-11 2 views
1

지난 며칠 동안 나는 이것을 달성하는 방법을 알아 내려고 노력해 왔으며 나의 작은 지식으로는 아무런 방법이 없습니다.다 대 다 관계가있는 세 엔티티 그룹화

나는 세 가지 엔티티 목록 < < 설계 한 - >> 항목 < <을 - >> 핵심 데이터 모델 디자이너에 보관할 것. 그들 각각은 "이름"이라고 불리는 하나의 속성만을 가지고 있습니다.

목표는 목록을 선택한 다음 목록에서 스토어별로 그룹화 된 모든 항목을 표시하는 것입니다.

// Set entity. 
    entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Set object filters. 
    predicate = [NSPredicate predicateWithFormat:@"ANY list.name == %@", self.list.name]; 
    [fetchRequest setPredicate:predicate]; 

    // Set FRC 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"store.name" cacheName:nil]; 

오류 :

'Invalid to many relationship in setPropertiesToFetch: (store.name)' 

에 의해 직접 행을 채우는 너무 이런 식으로 (방법을 아직 몰라요) :

내가 사용하려고했습니다

// Set entity. 
    entity = [NSEntityDescription entityForName:@"Store" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Set object filters. 
    predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(item.list, $x, $x.name == %@)[email protected] > 0", self.list.name]; 
    [fetchRequest setPredicate:predicate]; 

    // Set FRC 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"name" cacheName:nil]; 

오류 :

'Only allowed one toMany/manyToMany relationship in subquery expression collection (SUBQUERY(item.list, $x, $x.name == "List02"))' 

또한 가져온 속성 및 다른 방법으로는 아무데도 도달하지 못했습니다.

아이디어가 있으십니까?

감사합니다. Pedro.

+1

각 항목이 여러 저장소에있을 수 있고 가져 오기 요청이 동일한 항목을 여러 번 반환 할 수 없기 때문에 저장소별로 그룹화 할 수 없습니다. –

+0

데이터베이스에 다 대다 관계를 가져서는 안됩니다. 상호 참조 테이블과 다 대다 관계를 제거해야합니다. – danypata

+0

답변 해 주셔서 감사합니다. 크리스틴 - 클리어. Dany : 핵심 데이터가 장면 내에서 작동하는 방식과 상호 참조 테이블이 맞지 않습니까? 그렇다면 결과는 동일해야합니다. 맞습니까? – Pedro

답변

1

좋아, 해결책은 여기에있다 (danypata & Martin R이 나에게 열쇠를 준다).

이렇게하려면 다 - 대 - 다 관계를 깨기 위해 새 엔티티를 추가해야합니다. 최종 코어 데이터 모델은 다음과 같습니다. 목록 < < - >> 항목 < - >> ItemStore < < -> 스토어. "ItemStore"엔티티에는 관계 만있는 속성이 필요하지 않습니다.

코드 ...

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    [...] 

    // Set entity. 
    entity = [NSEntityDescription entityForName:@"ItemStore" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 


    // Set object filters. 
    predicate = [NSPredicate predicateWithFormat:@"ANY item.list.name == %@", self.list.name]; 
    [fetchRequest setPredicate:predicate]; 

    // Edit the sort key as appropriate. 
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"item.name" ascending:YES]; 
    sortDescriptors = @[sortDescriptor]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Set the batch size to a suitable number. 
    [fetchRequest setFetchBatchSize:20]; 

    // Set FRC. 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"store.name" cacheName:nil]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [...] 
} 

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    Item *item; 
    ItemStore *itemStore; 

    [...] 

    itemStore = (ItemStore *)[self.fetchedResultsController objectAtIndexPath:indexPath]; 
    item = itemStore.item; 
    cell.textLabel.text = item.name; 

    [...] 

} 

최종 노트 :

  • 브레이크 대다 새로운 법인과의 관계 (ItemStore)와 두 개의 일대 다 관계 (항목 < - >> 아이템 스토어 & 아이템 스토어 < < -> 스토어).
  • 항목의 "상점"관계가 선택 사항이므로 (내 모델에서) 저장소가없는 항목은 검색되지 않습니다. 그렇게하려면 기본적으로 항목을 "저장소 없음"개체에 지정해야합니다.

감사합니다. Pedro.

0

하나의 항목이 둘 이상의 저장소에있을 수있는 경우 저장소에서 항목 및 그룹을 가져올 수 없습니다. 그러나 NSFetchedResultsController을 테이블보기에 표시하거나 이와 비슷한 방법으로 사용하는 경우에도 여전히 가능합니다.

그룹화하려는 엔터티 (이 경우 Store)를 가져 오기하기 만하면됩니다. 섹션의

번호 :

Store *store = _fetchedResultsController.fetchedObjects[indexPath.section]; 
return store.items.count; 

한 항목에서 : 섹션의 행

Store *store = _fetchedResultsController.fetchedObjects[indexPath.section]; 
return store.name;  

번호 : 섹션

return _fetchedResultsController.fetchedObjects.count 

제목 따라 datasource 방법 테이블보기를 조정 상점 :

Store *store = _fetchedResultsController.fetchedObjects[indexPath.section]; 
Item *item = [[store.items sortedArrayUsingSortDescriptors:@[ 
    [NSSortDescriptor sortDescriptorWithKey:@"sortAttribute" ascending:YES]] 
    objectAtIndex:indexPath.row]; 
// configure cell with information from item. 

이렇게 될 수도 있지만 여전히 데이터 모델을 다시 생각해보고 싶을 것입니다. 하나의 항목이 둘 이상의 저장소에 있다는 것이 실제로 의미가 있습니까? 그렇지 않은 경우 일반 바닐라 가져온 결과 컨트롤러를 사용할 수 있습니다.

+0

네 말이 맞아. 목록 X에 속한 항목 만 추가로 가져 오려고하면 문제가 발생합니다. 하나의 항목이 둘 이상의 목록에있을 수 있기 때문입니다. 반면에, 그 아이템을 이미지하는 것은 "itemTypes"입니다; 동일한 유형의 상품이 다른 상점에있을 수 있습니다. 또한 다른 목록에도 있습니다. – Pedro

관련 문제