【问题标题】:nsexpression with custom function core data具有自定义函数核心数据的 nsexpression
【发布时间】:2013-09-30 06:14:33
【问题描述】:

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

【问题讨论】:

    标签: objective-c core-data nsexpression


    【解决方案1】:

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

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

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

    【讨论】:

    • 我现在拥有具有瞬态属性 cor 转换 UTC 日期的 nsfetchedresultcontroller。效果很好。除此之外,我必须对多个属性进行分组和计数。当后台上下文添加记录时,我必须通知 fetchedresultcontroller 更改,然后重新组合和重新计数。我正在努力解决它。我要看看链接的例子。
    • apple 的例子非常简单,可以进行日期转换。我真正需要知道的是如何将所有这些技巧结合在一起。首先转换日期时间,然后对日期和事件类型进行分组和计数。并且仍然能够建立一对多的关系。这样详细视图不仅可以显示分组事件,还可以显示关系中的信息。
    • 这似乎微不足道。你能用简单的英语解释一下你要实现的逻辑吗?
    • 抱歉我的英语不好:)。首先,这些表处于关系 A B。我必须对表 A 中的日期(utc)和事件类型进行分组和计数。但首先我必须将 utc 日期转换为本地时间日期。然后以某种方式删除时间,以便仅在 dd-mm-yy 上进行分组并在计算的 dd-mm-yy 上进行排序。如果日期超过一周,则仅显示日期。如果日期早于今天且小于一周,则显示 Sat-Sun-Mon... 如果日期等于今天,则仅显示 hh:mm。可以理解吗? :)
    • apple 的示例仅在瞬态属性上转换日期。没关系,但是如果您想对其进行分组,那么它将无法正常工作。不允许对瞬态属性进行分组并显示异常。在 nsdate 上分组真的是一场噩梦。我的意思是 nsdate 也包含时间,所以不会分组。我们只能将日期保存到其他属性,但本地时间不正确。所以我被这个问题困住了。
    【解决方案2】:

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

    【讨论】:

    • NSFetchRequest 有一些很好的属性“propertiesToFetch”和“propertiesToGroupBy”。所以基本上创建指向列的 NSPropertyDescription 类型的数组。您可以将 NSPropertyDescription 与 NSExpression 与聚合函数结合使用。
    猜你喜欢
    • 2013-03-30
    • 2012-02-27
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多