nsexpression与自定义功能核心数据

时间:2013-09-21 08:27:30

标签: objective-c core-data nsexpression

我正在尝试对核心数据实体上的日期进行分组和计算。由于时间不同,日期不能成组。所以我试图将自定义函数传递给nsexpression。但我得到一些错误,我不知道这是正确的方法。

分组和计数的代码:

NSEntityDescription *entity     = [NSEntityDescription entityForName:@"TEvents"
                                              inManagedObjectContext:context];
NSDictionary *props = [entity propertiesByName];

NSPropertyDescription *propDesc3 = [props objectForKey:@"startDateTime"];
NSExpression *propExpr3 = [NSExpression expressionForKeyPath:@"startDateTime"];
NSExpression *countExpr3 = [NSExpression expressionForFunction:propExpr3 selectorName:@"dateShort" arguments:nil];
NSExpressionDescription *exprDesc3 = [[NSExpressionDescription alloc] init];
[exprDesc3 setExpression:countExpr3];
[exprDesc3 setExpressionResultType:NSDateAttributeType];
[exprDesc3 setName:@"dateStart"];


NSFetchRequest *fr = [NSFetchRequest fetchRequestWithEntityName:@"TEvents"];
[fr setPropertiesToGroupBy:[NSArray arrayWithObjects:propDesc3, nil]];
[fr setPropertiesToFetch:[NSArray arrayWithObjects:propDesc3, exprDesc3, nil]];
[fr setResultType:NSDictionaryResultType];
NSError * error = nil;
NSArray *results = [context executeFetchRequest:fr error:&error];

dateShort是一个nsdate类别函数,它将数据时间转换为用户的当前区域:

-(NSString *) dateShort
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setCalendar:[NSCalendar currentCalendar]];
[formatter setTimeZone:[NSTimeZone localTimeZone]];
[formatter setDoesRelativeDateFormatting:YES];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];

NSString *tmpValue = [formatter stringFromDate:self];
return tmpValue;
}

错误:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'不支持的函数类型传递给SQL存储'

如何实现这一目标:将日期时间转换为当前区域和组并在核心数据实体上计数(yy-mm-dd)?

2 个答案:

答案 0 :(得分:0)

我认为你走错了路。对您的问题有一个更简单的解决方案。

您应该使用NSFetchedResultsController并在实体上使用transient属性作为节头。您可以在托管对象子类的类别中计算日期。然后就像在创建提取结果控制器时在sectionNameKeyPath中指定瞬态属性名称一样简单。

Apple有良好的工作example,在大多数情况下,您可以直接使用。

答案 1 :(得分:0)

我必须使用NSExpression来实现目标。 NSfetchResultController无法分组。