約100行のテーブルがあります。列の 1 つに「MeetingType」という名前の列があり、これは常に int 値 (1、2、または 3) です。
異なるタイプの行数のカウントを返すフェッチ述語を作成するにはどうすればよいですか?
たとえば、100 行のうち、50 行がタイプ = 0、25 行がタイプ =1、残りの 25 行がタイプ =2 の場合です。結果セットのカウントは 3 になります (すべての行に 3 つの異なるタイプがあったことを示しています)。
約100行のテーブルがあります。列の 1 つに「MeetingType」という名前の列があり、これは常に int 値 (1、2、または 3) です。
異なるタイプの行数のカウントを返すフェッチ述語を作成するにはどうすればよいですか?
たとえば、100 行のうち、50 行がタイプ = 0、25 行がタイプ =1、残りの 25 行がタイプ =2 の場合です。結果セットのカウントは 3 になります (すべての行に 3 つの異なるタイプがあったことを示しています)。
シンプルで純粋なNSFetchRequest
バージョンは次のとおりです。
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Meeting"];
[request setResultType:NSDictionaryResultType];
[request setPropertiesToGroupBy:@[@"MeetingType"]];
[request setPropertiesToFetch:@[@"MeetingType"]];
NSError* error = nil;
NSUInteger count = [[context executeFetchRequest:request error:&error] count];
結果をセットとして取得し、セット内のアイテムの数を数えます。
編集#2:これを行うためのより簡潔な方法を得るのに役立つ次のリンクもあります。http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html#//apple_ref/doc/uid/20002176-BAJEAIEE
編集:わかりました、これが試みです。
//you will be working on some sort of entity, i've guessed its called Meeting
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Meeting" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
//you can set a predicate here if you like, eg only meetings with a certain name or something
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", type_name];
[request setPredicate:predicate];
// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];
// Create an expression for the key path, in this case MeetingType
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"MeetingType"];
// Create an expression description using the maxExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"meetingTypes"];
[expressionDescription setExpression:keyPathExpression];
[expressionDescription setExpressionResultType:NSInteger32AttributeType];
// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
// Execute the fetch.
NSError *error = nil;
NSArray *objects = [sharedAISDataService.managedObjectContext executeFetchRequest:request error:&error];
//check for no error
if(error == nil){
//the following set will contain unique NSNumber objects
NSSet *setOfMeetinTypes = [NSSet setWithArray:objects];
int numberOfMeetinTypes = [setOfMeetinTypes count];
//you now have the number of unique meeting types
}
セット内でカウントする代わりに、3 つのカウント フェッチを行うことができます。
NSError *error;
int count;
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([yourObject class])];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"MeetingType == 1"];
count = [managedObjectContext countForFetchRequest:fetchRequest error:&error];
if (count > 0) {
//Add 1 to your set or handle appropriately
}
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"MeetingType == 2"];
count = [managedObjectContext countForFetchRequest:fetchRequest error:&error];
if (count > 0) {
//Add 2 to your set or handle appropriately
}
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"MeetingType == 3"];
count = [managedObjectContext countForFetchRequest:fetchRequest error:&error];
if (count > 0) {
//Add 3 to your set or handle appropriately
}
これは、実際にオブジェクトを引き出して、そのセットで異なる MeetingType 属性を持つオブジェクトを検索するよりもはるかに高速です。