2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-10-14

実装方法

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

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版

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?