
[英]using NSPredicate in NSFetchedResultsController in core data
[英]NSPredicate with NSFetchedResultsController get all in data store, but limit a certain match?
我不确定这是否可能-也许使用子查询-但是,我想设置一个提取请求,该请求将获取数据存储中与一组特定属性匹配的所有实体。 很简单,但是我也想限制匹配另一组条件的对象的数量。
与滚动我自己的数组并进行管理相比,与FRC的运行非常好相比,我更希望能够坚持使用NSFetchedResultscontroller。
我将使用一个示例,因为这与我一直在从事的项目有关,并且希望不要“放弃太多”。 基本实体示例:
胶带
码:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Tape"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"manufacturer = %@", manufacturer];
request.predicate = predicate
request.sortDescriptors = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSFetchedResultsController frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:@"isTransparent" cacheName:nil];
FRC使用名称按字母顺序排序,并使用isTransparent标志分隔各节(效果很好)。
商店中可能有多个带有isEmpty标志的对象; 但是,当显示给用户时,在任何给定时间,我只想显示一个带有isEmpty标志的。
因此,我们可能有一家商店,其以下商品:
从当前谓词中,我们将得到一个这样的表:
我想知道的是,是否有可能在表格视图中获得类似的内容(与FRC匹配):
因此,表视图由isTransparent标志分割,但仅显示一个带有isEmpty标志的对象。
希望以下附加代码会有所帮助。 这就是我使用数组的方式(注意快速而又肮脏):
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Tape"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"manufacturer = %@", manufacturer];
request.predicate = predicate
request.sortDescriptors = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
BOOL foundEmpty = NO;
NSMutableArray *sectionOne = [[NSMutableArray alloc] init];
NSMutableArray *sectionTwo = [[NSMutableArray alloc] init];
NSArray *result = [self.managedObjectContext executeFetchRequest:request error:nil];
for (Tape *tape in result) {
if ( tape.isEmpty.boolValue && !foundEmpty && tape.isTransparent.boolValue ) {
// only include one isEmpty object
[sectionOne addObject:tape];
foundEmpty = YES;
} else if ( tape.isEmpty.boolValue && !foundEmpty && !tape.isTransparent.boolValue ) {
// only include one isEmpty object
[sectionOne addObject:tape];
foundEmpty = YES;
} else if ( tape.isTransparent.boolValue && !tape.isEmpty.boolValue ) {
// always include non-isEmpty objects
[sectionOne addObject:tape];
} else if ( !tape.isEmpty.boolValue ) {
// always include non-isEmpty objects
[sectionTwo addObject:tape];
}
}
NSArray self.dataSource = @[sectionOnce, sectionTwo];
尝试以下谓词
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(manufacturer = %@) AND (NOT (isTransparent = 0 AND isEmpty = 1)))", manufacturer];
上面的代码与制造商一起检查isEmpty是否为YES,
很简单,您要做的就是向表委托方法添加一些逻辑。 当前,您将从FRC返回节的行数。 相反,对于适当的部分,返回:
MIN(1, rowCountFromFRC)
这样,如果没有行,则不会显示任何行,但是如果有行,则最多将显示1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.