iOS:在核心数据谓词中使用@min和@max

时间:2012-06-11 10:02:48

标签: ios core-data

我有一个核心数据实体Client,它具有discount属性。我想以最小的折扣获取客户端。

我使用以下NSPredicate

[NSPredicate predicateWithFormat:@"@min.discount"];

但是,我收到以下错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "@min.discount"'

什么做得不对?

1 个答案:

答案 0 :(得分:7)

我不认为NSPredicate支持这样的函数,除非它是布尔谓词表达式的一部分(即涉及"大于")。

您应该阅读this CoreData documentation,其中提供了一些示例,特别是使用max作为示例:

  

创建和使用表达式需要遵循许多步骤   描述

     

首先,您需要创建表达式(NSExpression的实例)来表示您感兴趣的值的关键路径,并且   表示要应用的函数(例如max:或min:):

NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"salary"];
NSExpression *maxSalaryExpression = [NSExpression expressionForFunction:@"max:"
                                                  arguments:[NSArray arrayWithObject:keyPathExpression]];
     

有关支持的功能的完整列表,请参阅expressionForFunction:arguments:

     

然后创建表达式描述并设置其名称,表达式和结果类型。

     

名称是将在字典中用于返回值的键。如果要检索多个值,例如   Employee表中最大和最小的工资 - 名称   对于给定的提取请求,每个表达式描述必须是唯一的。

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"maxSalary"];
[expressionDescription setExpression:maxSalaryExpression];
[expressionDescription setExpressionResultType:NSDecimalAttributeType];
     

最后,您将请求的属性设置为仅获取由表达式表示的属性:

[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];