Edited at

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

More than 3 years have passed since last update.


実装方法

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


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

自分は初めて触りました。

これ配列で使えるんですね。

思ってみれば、NSPredicateNSArrayで使用できるのでそれと同じなのかな。

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

配列内で集計関数(最大値、最小値、平均値、合計値など)を使用する方法


2. NSFetchRequestResultType

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


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.

引用元 : NSFetchRequestResultType - NSFetchRequest Class Reference


となっておりました。


終わりに

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

※書きました。

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

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