CoreData获取3个实体和多对多关系的结果

时间:2011-08-09 02:03:35

标签: objective-c core-data

我有一个DataModel,它有一个Category,SubCategory和DetailedItem实体。类别与SubCategory具有1对多。每个SubCategory与DetailedItem具有1对多的关系。因此,类别具有一组子类别,并且对于每个子类别,它具有一组详细项目。

类别具有subCategories的Set属性和Name属性。 SubCategory具有detailItems的Set属性,Name属性和Category父属性

我的问题是如何使用NSFetchedResultsController从给定类别中的给定SubCategory中检索所有详细项目。

我正在尝试这样的事情,但我认为我的NSPredicate不正确

 if (__fetchedResultsController == nil) {
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"DetailedItem" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entityDescription];

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Category.name CONTAINS[c] 'Movies'"];

    [fetchRequest setPredicate:predicate];


    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; // probably not needed
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

    NSFetchedResultsController *fetchedResults = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:@"AllItems"];
    fetchedResults.delegate = self;
    __fetchedResultsController = fetchedResults;

    NSError *error;
    if (![__fetchedResultsController performFetch:&error]) {
        NSLog(@"Error fetching");
    }

    [sortDescriptor release];
    [fetchRequest release];
}

目标是如果Category == Food and SubCategory == Meat,那么我将获得属于该类别&的所有详细项目的列表。子类别。如果有什么不清楚,我会尝试提供更多的背景。

1 个答案:

答案 0 :(得分:1)

如果您的数据模型如下:

Category{
  name:string
  subCategories<-->>SubCategory.category
}

SubCategory{
  name:string
  category<<-->Category.subCategories
  detailedItems<-->>DetailItem.subCategory
}

DetailedItem{
  name:string
  subCategory<<-->SubCategory.detailedItems
}

...并且您需要一个DetailedItem个对象的表,您将获取实体设置为DetailedItem,然后您的所有密钥路径都从DetailItem实体开始。

如果您只拥有CategorySubCategory对象的名称,那么您可以构建一个谓词:

 NSPredicate *p = [NSPredicate predicateWithFormat:@"subCategory.name==%@ AND subCategory.category.name==%@", subCatName,catName];

请注意,如果任一实体的对象中有重复的名称值,您将获得所有匹配的对象。

如果您手头有实际的CategorySubCategory个对象,可以使用以下方法进行更快速的测试:

 NSPredicate *p = [NSPredicate predicateWithFormat:@"subCategory==%@ AND subCategory.category==%@", aSubCatObj,aCatObj];