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