繁体   English   中英

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

[英]Filter NSFetchedResultsController to get only objects with some relationship

我有两个实体,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;
    }

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

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

例如

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"B.@count == 0"];
[fetchRequest setPredicate:predicate];

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

作为@Abizern在评论中提到的,你需要一个添加NSPredicateNSFetchedResultsController 谓词将是这样的:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"b == %@", myVarReferenceToB]];

如果您在B中只有一个唯一标识符(让我们称之为identifier )而不是对象引用,您可以将其写为:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"b.identifier == %@", myVarReferenceToBIdentifier]];

这将产生您的过滤器。

每次用户更改分段控件时,您都需要重新构建fetch,或者需要在每个段中保留一个NSFetchedResultsController

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM