繁体   English   中英

带NSFetchedResultsController的NSPredicate可以在数据存储区中获取所有内容,但可以限制某个匹配项?

[英]NSPredicate with NSFetchedResultsController get all in data store, but limit a certain match?

我不确定这是否可能-也许使用子查询-但是,我想设置一个提取请求,该请求将获取数据存储中与一组特定属性匹配的所有实体。 很简单,但是我也想限制匹配另一组条件的对象的数量。

与滚动我自己的数组并进行管理相比,与FRC的运行非常好相比,我更希望能够坚持使用NSFetchedResultscontroller。

我将使用一个示例,因为这与我一直在从事的项目有关,并且希望不要“放弃太多”。 基本实体示例:

胶带

  • (字符串)名称
  • (关系)制造商
  • (布尔)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:)];

NSFetchedResultsController frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:@"isTransparent" cacheName:nil];

FRC使用名称按字母顺序排序,并使用isTransparent标志分隔各节(效果很好)。

商店中可能有多个带有isEmpty标志的对象; 但是,当显示给用户时,在任何给定时间,我只想显示一个带有isEmpty标志的。

因此,我们可能有一家商店,其以下商品:

  • Alpha磁带(isEmpty = 0,isTransparent = 1)
  • Beta磁带(isEmpty = 0,isTransparent = 0)
  • 伽玛磁带(isEmpty = 1,isTransparent = 1)
  • 增量磁带(isEmpty = 1,isTransparent = 0)

从当前谓词中,我们将得到一个这样的表:

  • Alpha磁带(isEmpty = 0,isTransparent = 1)
  • 伽玛磁带(isEmpty = 1,isTransparent = 1)
  • 分节符
  • Beta磁带(isEmpty = 0,isTransparent = 0)
  • 增量磁带(isEmpty = 1,isTransparent = 0)

我想知道的是,是否有可能在表格视图中获得类似的内容(与FRC匹配):

  • Alpha磁带(isEmpty = 0,isTransparent = 1)
  • 伽玛磁带(isEmpty = 1,isTransparent = 1)
  • 分节符
  • Beta磁带(isEmpty = 0,isTransparent = 0)

因此,表视图由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.

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