Core Data - 最大値を取得する

2010年7月19日月曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

Core Data に格納されたデータの中から特定の属性値が最大値を取得したい。
SQL だと
SELECT MAX(timeStamp) FROM Book;
と、たった一行で簡単に取得できるが Core Data ではどうか?


前提


こんなエンティティがあったとする。

この属性値 timeStamp の最大値(すなわち最も最近の日時)を取得するメソッドを用意する。またこのメソッドは絞り込みの条件として Author(NSManagedObjectのサブクラス)を渡すことができる。


コード見本


こんな感じ。

- (Book*)lastTimeStampOfAuthor:(Author*)author
{
 NSManagedObjectContext* moc = self.managedObjectContext;
 
 NSFetchRequest* request = [[NSFetchRequest alloc] init];
 
 // entity
 NSEntityDescription* entity = [NSEntityDescription entityForName:@"Book"
    inManagedObjectContext:moc];
 [request setEntity:entity]; 

 // expression
 NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"timeStamp"];
 NSExpression *expression =
 [NSExpression expressionForFunction:@"max:"
   arguments:[NSArray arrayWithObject:keyPathExpression]];

 // expresssion description
 NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
 [expressionDescription setName:@"maxTimeStamp"];
 [expressionDescription setExpression:expression];
 [expressionDescription setExpressionResultType:NSDateAttributeType];

 // result properties
 [request setResultType:NSDictionaryResultType];
 [request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];

 // predicate
 if (author) {
  NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Author == %@", author];
  [request setPredicate:predicate];
 }

 // execution
 NSError* error = nil;
 NSArray* array = [moc executeFetchRequest:request error:&error];
 NSDate* timeStamp = nil;
 
 if (error) {
  NSLog(@"[ERROR] %@", error);
 } else {
  timeStamp = [[array objectAtIndex:0] valueForKey:@"maxTimeStamp"];
 }

 [expressionDescription release];
 [request release];
 return timeStamp;
 
}


長っ...


参考情報


Core Data Programming Guide: Fetching Managed Objects - Fetching Specific Values


補足

(7/27補足)SQLを確認したところ次のようになっていた。
CoreData: sql: SELECT max( t0.ZTREATEDDATE) FROM ZKARTE t0 WHERE  t0.ZCUSTOMER = ? 

やっぱり1行か。

Responses

Leave a Response

人気の投稿(過去 30日間)