与 NSfetchedresultscontroller 的一对多关系

One to many relationship with NSfetchedresultscontroller

我在从一对多关系中获取对象时遇到问题。 我有两个实体 "Featured" 和 "Event",特色对象包含一个 属性 个 featuredEvents,这是一对多关系,一个 "Featured" 项到多个 "Events".

现在我需要使用 NSFetchedResultsController 来 return "featuredEvents" 关系中的事件。我正在使用以下代码:

 NSFetchedResultsController *fetchedFeaturedEvents;
    NSFetchRequest *fetchRequest;
    NSError *error = nil;

    fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"SDMFeaturedEvent"];
    [fetchRequest setSortDescriptors:@[]];

    fetchedFeaturedEvents = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:theManagedObjectContext sectionNameKeyPath:nil cacheName:nil];
    [fetchedFeaturedEvents performFetch:&error];

    if (error) {
        NSLog(@"Unable to perform fetch.");
        NSLog(@"%@, %@", error, error.localizedDescription);
    }

    return fetchedFeaturedEvents;

这在 return 特色活动中很棒,但我也希望仅向 return "featuredEvents" 属性 中的活动添加谓词。所以问题是我如何创建谓词?

我基本上需要 "Featured" 对象的 featuredEvents 属性 中的所有 "Events" 我正在为其获取,这可能吗?

对于那些一直有类似问题的人,我最终使用了这种方法:

NSFetchRequest *fetchRequest;
    NSError *error = nil;
    NSArray *fetchedObjects;
    NSPredicate *soldOutPredicate;
    NSPredicate *criteriaMatchPredicate;
    NSCompoundPredicate *fullPredicate;
    NSSortDescriptor *usesDescriptor = [[NSSortDescriptor alloc] initWithKey:@"eventDate" ascending:YES];

    fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"FeaturedEvent"];
    [fetchRequest setSortDescriptors:@[]];
    fetchedObjects = [theManagedObjectContext executeFetchRequest:fetchRequest error:&error];

    if (error) {
        NSLog(@"Unable to perform fetch.");
        NSLog(@"%@, %@", error, error.localizedDescription);
    }

    if ([[NSSDMUserDetails sharedManager]showsCriteraMatchEvents]) {

        if ([[NSSDMUserDetails sharedManager]isUserMale]) {
            criteriaMatchPredicate = [NSPredicate predicateWithFormat:@"(eventAgeMaleMin <= %@) AND (eventAgeMaleMax >= %@)",[[[NSSUserDetails sharedManager]userAge]stringValue],[[[NSUserDetails sharedManager]userAge]stringValue]];
        }
        else{
            criteriaMatchPredicate = [NSPredicate predicateWithFormat:@"(eventAgeFemaleMin <= %@) AND (eventAgeFemaleMax >= %@)",[[[NSUserDetails sharedManager]userAge]stringValue],[[[NSUserDetails sharedManager]userAge]stringValue]];
        }

        fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[criteriaMatchPredicate]];

    }

    if (![[NSSDMUserDetails sharedManager]showsSoldOutEvents]) {

        if ([[NSSDMUserDetails sharedManager]isUserMale]) {
            soldOutPredicate = [NSPredicate predicateWithFormat:@"eventPlacesMale == %@ || eventPlacesMale != %@",@"in stock",@"0"];
        }
        else{
            soldOutPredicate = [NSPredicate predicateWithFormat:@"eventPlacesFemale == %@ || eventPlacesFemale != %@",@"in stock",@"0"];
        }

        fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[soldOutPredicate]];
    }

    if (soldOutPredicate && criteriaMatchPredicate) {

        fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[soldOutPredicate,criteriaMatchPredicate]];

    }

    if (fetchedObjects && fetchedObjects.count > 0) {

        SDMFeaturedEvent *feat = [fetchedObjects objectAtIndex:0];
        NSLog(@"All featured events %@",feat.featuredEvents);
        if (fullPredicate) {
            return [[feat.featuredEvents.allObjects filteredArrayUsingPredicate:fullPredicate]sortedArrayUsingDescriptors:@[usesDescriptor]];
        }
        else if (![[NSSDMUserDetails sharedManager]showsCriteraMatchEvents]){
            return [feat.featuredEvents.allObjects sortedArrayUsingDescriptors:@[usesDescriptor]];
        }
        else{
            return [NSArray new];
        }

    }
    return [NSArray new];

诀窍是 return 来自 featuredEvent "featuredEvents" 属性 的事件数组,然后您可以 运行 filteredArrayUsingPredicate 和 sortedArrayUsingDescriptor 方法对事件对象进行排序在数组中,无论您有什么要求。当然,这不是 returning NSFetchedResultsController,但这对过滤非常有用。