【CoreData】あるEntityのあるPropertyの最大値、最小値を取得する


## 実装方法

以下のような感じでできました。

```objc:MaxValue.m
/// 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`で使用できるのでそれと同じなのかな。

以下の記事がすごくわかりやすいかと。

[配列内で集計関数(最大値、最小値、平均値、合計値など)を使用する方法](http://hachinobu.hateblo.jp/entry/2014/05/12/163136)

### 2. NSFetchRequestResultType

この値は以下のenumになります。

```objc:NSAttributeType
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.
>
<cite>引用元 : [NSFetchRequestResultType - NSFetchRequest Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/#//apple_ref/c/tdef/NSFetchRequestResultType)
</cite>

となっておりました。

## 終わりに

近いうちに`Swift2.0`版でも書いてみたいと思います。

※書きました。

[【CoreData】あるEntityのあるPropertyの最大値、最小値を取得するのSwift版](http://qiita.com/ryokosuge/items/022b878f0776adacd260)

よかったら参考にどうぞ。