0

コア データ エンティティの日付をグループ化してカウントしようとしています。時間が異なるため、日付をグループ化できないためです。だから私は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 ストアに渡されました'

この目標を達成する方法: datetime を現在のゾーンとグループに変換し、コア データ エンティティで (yy-mm-dd) をカウントしますか?

4

2 に答える 2

0

私はNSExpression目標を達成するために使用しなければなりませんでした。NSfetchResultControllerグループ化できません。

于 2013-09-29T07:52:58.687 に答える
0

ここであなたは間違った道を進んでいると思います。あなたの問題にはもっと簡単な解決策があります。

NSFetchedResultsController を使用し、エンティティで一時的なプロパティを使用して、セクション ヘッダーとして機能する必要があります。管理対象オブジェクト サブクラスのカテゴリで日付を計算します。sectionNameKeyPath次に、フェッチされた結果コントローラーを作成するときに、一時的なプロパティ名を指定するのと同じくらい簡単です。

Apple には、ほとんどの目的ですぐに使用できる優れた実用的な例があります。

于 2013-09-21T11:23:53.363 に答える