我有一个Core Data数据库,其中包含一个实体“Event”和一个带有“Date”类型的属性“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
...
不喜欢获取所有数据库,因为它可能很大,所以我使用聚合操作不获取每个对象。 代码工作没有错误,但结果数组为空。 我猜这个问题是使用日期类型属性和NSAttribute / attributeType进行分组但无法使其工作。 Event的类别文件中的代码是:
+ (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;
}
答案 0 :(得分:0)
聚合NSDate
并不是一个好主意,因为它是由浮点类型支持的。如果您将自参考日期以来的天数存储为int32_t
,则可能会更容易。您需要使用NSDateComponents
:
@implementation NSDate (Days)
- (NSInteger)daysSinceReferenceDate;
{
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comp = [cal components:NSDayCalendarUnit fromDate:[NSDate dateWithTimeIntervalSinceReferenceDate:0] toDate:self options:0];
return [comp day];
}
@end
答案 1 :(得分:0)
唯一的问题是当我将“results”数组转移到另一个数组时后者的分配代码被意外注释掉了,这就是我在NSLog中得到空数组的原因。所以GOOD NEWS可以在DATE属性上使用聚合操作,解决方案就在上面。 “results”数组的打印输出:
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";
}
)