【问题标题】:CoreData Fetching Results With 3 Entities and Many to Many RelationshipsCoreData 使用 3 个实体和多对多关系获取结果
【发布时间】:2011-08-09 02:03:35
【问题描述】:

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

Category 具有 subCategories 的 Set 属性和 Name 属性。 SubCategory 有一个 detailItems 的 Set 属性、一个 Name 属性和 Category 父属性

我的问题是如何使用 NSFetchedResultsController 从给定类别中的给定子类别中检索所有详细信息。

我正在尝试这样的事情,但我认为我的 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];
}

目标是如果类别 == 食品和子类别 == 肉类,那么我将获得属于该类别和子类别的所有详细项目的列表。如果有任何不清楚的地方,我会尝试提供更多背景信息。

【问题讨论】:

    标签: objective-c core-data


    【解决方案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];
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 2015-12-12
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多