[英]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在评论中提到的,你需要一个添加NSPredicate
您NSFetchedResultsController
。 谓词将是这样的:
[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.