実装方法
以下のような感じでできました。
/// maxの値のkey
NSString *expressionName = @"maxWeight";
/// お決まりのやつ
/// 生成方法は各自でお任せです
NSManagedObjectContext *context = [CoreData sharedInstance].managedObjectContext;
/// fetch requestの生成
NSFetchRequest *fetchRequest = [NSFetchRequest new];
/// entity descriptionの生成
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Entity名" inManagedObjectContext:context];
fetchRequest.entity = entityDescription;
/// NSExpressionの生成
/// 解説.1
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"weight"];
NSExpression *expression = [NSExpression expressionForFunction:@"max:" arguments:@[keyPathExpression]];
NSExpressionDescription *expressionDescription = [NSExpressionDescription new];
expressionDescription.name = expressionName;
expressionDescription.expression = expression;
expressionDescription.expressionResultType = NSDoubleAttributeType;
/// 結果のタイプを指定(NSFetchRequestResultType)
/// 解説.2
fetchRequest.resultType = NSDictionaryResultType;
fetchRequest.propertiesToFetch = @[expressionDescription];
/// もし条件をつけくわえるなら
if () {
/// NSPredicateの生成
NSPredicate *predicate = [NSPredicate predicateWithFormat:@""];
fetchRequest.predicate = predicate;
}
NSError *error = nil;
NSArray *results = [[CCGCoreData sharedInstance].managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (error) {
return nil;
}
/// この値が最大値となります
id *maxWeight = [results.firstObject valueForKey:expressionName];
解説
1. NSExpression
自分は初めて触りました。
これ配列で使えるんですね。
思ってみれば、NSPredicate
もNSArray
で使用できるのでそれと同じなのかな。
以下の記事がすごくわかりやすいかと。
配列内で集計関数(最大値、最小値、平均値、合計値など)を使用する方法
2. NSFetchRequestResultType
この値は以下のenumになります。
enum {
NSManagedObjectResultType = 0x00,
NSManagedObjectIDResultType = 0x01,
NSDictionaryResultType = 0x02
NSCountResultType = 0x04
};
typedef NSUInteger NSFetchRequestResultType;
だいたいみればわかるかなと。
今回は最大値が欲しかったので、NSDictionaryResultType
を選択しました。
引用させていただくと
NSManagedObjectResultType
Specifies that the request returns managed objects.
Available in iOS 3.0 and later.
NSManagedObjectIDResultType
Specifies that the request returns managed object IDs.
Available in iOS 3.0 and later.
NSDictionaryResultType
Specifies that the request returns dictionaries.
See also includesPendingChanges and propertiesToFetch.
Available in iOS 3.0 and later.
NSCountResultType
Specifies that the request returns the count of the objects that match the request.
Available in iOS 3.0 and later.
引用元 : NSFetchRequestResultType - NSFetchRequest Class Reference
となっておりました。
終わりに
近いうちにSwift2.0
版でも書いてみたいと思います。
※書きました。
【CoreData】あるEntityのあるPropertyの最大値、最小値を取得するのSwift版
よかったら参考にどうぞ。