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