过滤NSFetchedResultsController以仅获取具有某种关系的对象

dou*_*sd3 3 core-data objective-c uitableview nsfetchedresultscontroller ios

我有两个实体,A和B,以及以下关系:

A - > B - 对很多人来说

B - > A - 到一个

换句话说:A可以有零个或多个B,B只能有一个A.

我想使用NSFetchedResultsController在表视图中显示我的A条目,但我想通过A - > B关系过滤结果.为此,我有一个UISegmentedControl,如果用户点击第一个段我只想显示与B至少有一个关系的A个条目,如果点击了第二个段我想只显示没有关系的条目与B.

我正在使用CoreData的NSManagedObject,因此我的A对象具有NSSet属性,其中所有B条目都与A的关系.

这是我如何实例化我的NSFetchedResultsController:

    NSManagedObjectContext *context = self.managedObjectContext;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:"A" inManagedObjectContext:self.managedObjectContext];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:descriptorKey ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    [fetchRequest setEntity:entity];


    NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
                                              initWithFetchRequest:fetchRequest
                                              managedObjectContext:context
                                              sectionNameKeyPath:controllerKey
                                              cacheName:nil];

    NSError *error;
    BOOL success = [controller performFetch:&error];

    if (success) {
        return controller;
    }
Run Code Online (Sandbox Code Playgroud)

此代码获取所有A条目,我该如何制作该过滤器?

Abi*_*ern 6

您需要为获取请求添加谓词:

例如

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"B.@count == 0"];
[fetchRequest setPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

这将过滤A没有任何相关B对象的s.