1

エンティティ「Event」と「Date」タイプの属性「eventDate」を持つCoreDataデータベースがあります。タスクは、日付ごとにグループ化されたイベントを表示し、日付ごとのイベントの数(@ "count")を表示します。たとえば、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を使用したグループ化ですが、機能させることができませんでした。イベントのカテゴリファイルのコードは次のとおりです。

+ (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;

}

4

2 に答える 2

0

NSDate浮動小数点型に基づいているため、 a での集計はお勧めできません。基準日からの日数などを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
于 2013-02-12T20:02:04.560 に答える
0

唯一の問題は、「結果」配列を別の配列に転送したときに、後者の割り当てコードが誤ってコメントアウトされたことでした。これが、NSLog に空の配列を取得した理由です。したがって、DATE属性で集計操作を使用することが可能であり、解決策は上記のとおりです。「結果」配列の出力:

 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";
}

)

于 2013-02-13T14:27:36.657 に答える