CoreData - 最大値をもつ NSManagedObject を取得するコード見本

2010年8月2日月曜日 | Published in | 0 コメント

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

以前、最大値の求め方について書いた。

Cocoaの日々: Core Data - 最大値を取得する

では、その最大値を持つ NSManagedObject を取得するにはどうしたら良いのか?


コード例


こんな感じ。
- (NSManagedObject*)lastTimeStampObject
{
    NSManagedObjectContext* moc = self.managedObjectContext;
    NSFetchRequest* request = [[[NSFetchRequest alloc] init] autorelease];

    NSEntityDescription* entity = [NSEntityDescription entityForName:@"Event"
                                              inManagedObjectContext:moc];
    [request setEntity:entity]; 

    NSSortDescriptor* sort = [NSSortDescriptor sortDescriptorWithKey:@"timeStamp"
                                                           ascending:NO];
    [request setSortDescriptors:[NSArray arrayWithObject:sort]];
    [request setFetchLimit:1];

    NSError* error = nil;
    NSArray* results = [moc executeFetchRequest:request error:&error];
    
    if ([results count] > 0) {
        return [results objectAtIndex:0];
    } else {
        return nil;
    }
}

timeStamp の降順で検索をかけ、1番目の要素を返している。
出力されているSQLは次の通り。
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZTIMESTAMP
 FROM ZEVENT t0 ORDER BY t0.ZTIMESTAMP DESC LIMIT 1

-[NSFetchRequest setFetchLimit:1] を指定により SQLでも 'LIMIT 1'が付与されている。この為結果は1もしくは0(まったくレコードが無い)のどちらかになる。



サンプル


Xcodeで生成される CoreDataサンプルコードに手を加えてみた。


左下のボタンを押すと最大値を持つ NSManagedObject の descriptionがデバッグコンソールへ出力される。

ソースコード


GitHub からどうぞ
LargestManagedObject at 2010-08-02 from xcatsan's iOS-Sample-Code - GitHub

Responses

Leave a Response

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