我有两个实体,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条目,我该如何制作该过滤器?
答案 0 :(得分:6)
您需要为获取请求添加谓词:
e.g。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"B.@count == 0"];
[fetchRequest setPredicate:predicate];
这将过滤没有任何相关B对象的A
。
答案 1 :(得分:2)
正如@Abizern在评论中提到的那样,您需要向NSPredicate
添加NSFetchedResultsController
。谓词类似于:
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"b == %@", myVarReferenceToB]];
如果您在B中只有一个唯一标识符(我们称之为identifier
)而不是对象引用,您可以将其写为:
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"b.identifier == %@", myVarReferenceToBIdentifier]];
这将生成您的过滤器。
每次用户更改分段控件时,您都需要重新构建提取,或者每个段需要保留一个NSFetchedResultsController
。