具有自定义函数核心数据的 NS表达式



我正在尝试对核心数据实体进行分组和计数。 由于日期不同,无法分组。 所以我正在尝试将自定义函数传递给 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)?

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

您应该使用 NSFetchedResultsController 并使用实体上的瞬态属性作为节标题。计算托管对象子类类别中的日期。然后,只需在创建提取的结果控制器时在sectionNameKeyPath中指定瞬态属性名称即可。

Apple有一个很好的工作示例,在大多数情况下,您可以开箱即用。

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

最新更新