Ios 表视图中核心数据的聚合操作,按日期计数和分组

Ios 表视图中核心数据的聚合操作,按日期计数和分组,ios,core-data,aggregate-functions,nsexpression,Ios,Core Data,Aggregate Functions,Nsexpression,我有一个核心数据数据库,其中包含一个实体事件和一个日期类型的属性eventDate。 该任务按日期显示事件分组,并按日期显示事件数@计数。例如,eventDate mm dd yyyy数据: events eventDate event 1 01-01-2013 event 2 01-01-2013 event 3 01-02-2013 event 4 01-03-2013 ... 表视图中的结果: date count 01-01-2013

我有一个核心数据数据库,其中包含一个实体事件和一个日期类型的属性eventDate。 该任务按日期显示事件分组,并按日期显示事件数@计数。例如,eventDate mm dd yyyy数据:

events     eventDate
event 1    01-01-2013
event 2    01-01-2013
event 3    01-02-2013
event 4    01-03-2013
...
表视图中的结果:

date         count
01-01-2013     2
01-02-2013     1
01-03-2013     1
...
我不喜欢获取所有数据库,因为它可能很大,所以我使用聚合操作来获取每个对象。 代码正常工作,但生成的数组为空。 我猜问题在于使用date-type属性和NSAttribute/attributeType进行分组,但无法使其正常工作。 事件类别文件中的代码为:

+ (NSArray *)aggregateOperationOnEvent:(NSString *)attributeName withFunction:(NSString *)function withPredicate:(NSPredicate *)predicate inManagedObjectContext: (NSManagedObjectContext*)context {

NSEntityDescription* entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];

NSAttributeDescription* attributeDesc = [entity.attributesByName objectForKey:attributeName];


NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: attributeName];
NSExpression *functionExpression = [NSExpression expressionForFunction: [NSString stringWithFormat:@"%@:", function] arguments: [NSArray arrayWithObject:keyPathExpression]];

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName: function];
[expressionDescription setExpression: functionExpression];
[expressionDescription setExpressionResultType: NSInteger32AttributeType];


NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Event"];

[request setPropertiesToFetch:[NSArray arrayWithObjects:attributeDesc, expressionDescription, nil]];
[request setPropertiesToGroupBy:[NSArray arrayWithObject:attributeDesc]];
[request setResultType:NSDictionaryResultType];

if (predicate != nil)
    [request setPredicate:predicate];

NSError* error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];

return results;
}

在NSDate上聚合不是一个好主意,因为它是由浮点类型支持的。如果将自参考日期起的天数之类的内容存储为int32\t,事情可能会更简单。您需要使用以下组件:


唯一的问题是,当我将结果数组转移到另一个数组时,后者的分配代码意外地被注释掉了,这就是为什么我在NSLog中得到了空数组。好消息是,可以对日期属性使用聚合操作,解决方案如上所述。结果数组的打印输出:

 2013-02-13 19:19:48.063 YourAppsName[35147:c07] -------- results = (
    {
    count = 2;
    eventDate = "2013-01-01 00:00:00 +0000";
},
    {
    count = 1;
    eventDate = "2013-01-02 00:00:00 +0000";
},
    {
    count = 1;
    eventDate = "2013-01-03 00:00:00 +0000";
}

您要传递的函数是什么?请注意request.propertiesToGroupBy=@[attributeName];等也可以代替查找相应的NSAttributedDescription。您的解决方案存在一些问题。正如我提到的,我需要日期作为tableView单元格的标签。我不认为NSDate在这种情况下会有问题,因为在Apple文档中有一个NSDate的代码片段,其形式为[expressionDescription setExpressionResultType:NSDateAttributeType];函数是@count,但可以是@min等其他任何函数。我之前尝试了@attributesName]版本,但没有成功。
 2013-02-13 19:19:48.063 YourAppsName[35147:c07] -------- results = (
    {
    count = 2;
    eventDate = "2013-01-01 00:00:00 +0000";
},
    {
    count = 1;
    eventDate = "2013-01-02 00:00:00 +0000";
},
    {
    count = 1;
    eventDate = "2013-01-03 00:00:00 +0000";
}