CoreDataについて、幾つか小技があるのでメモ。
該当件数を取得する
SQLに於けるcount文です。
NSManagedObjectContext \*context = ...; NSFetchRequest \*request = ...; NSError *error = nil; NSUInteger count = [context countForFetchRequest:request error:&error];
最大値取得
本来はNSExpressionDescriptionを使うべきなのでしょうが、ソースが長くなるので order … limit 1 で代用できます。 idの最大値を取る場合
NSManagedObjectContext \*context = ...; NSFetchRequest \*request = ...; NSSortDescriptor \*descriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:NO]; NSArray \*sortArray = [NSArray arrayWithObject:descriptor]; [request setSortDescriptors:sortArray]; [request setFetchLimit:1]; NSError \*error = nil; NSArray \*results = [_context executeFetchRequest:request error:&error]; NSNumber *max = [[results lastObject] id];
NSManagedObjectにNSDictinaryからデータを代入する
Book * book = ... ; // BookはNSManagedObjectのサブクラス NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys: @"life",@"title", @"wicket",@"auther", nil]; [book setValuesForKeysWithDictionary:dic];
逆にNSManagedObjectからNSDictionaryとしてデータを取り出す
NSDictionary *dic = [book dictionaryWithValuesForKeys:[[[book entity] attributesByName] allKeys]];
最初からNSDictionaryでデータを取得する
NSManagedObjectContext \*context = ...; NSFetchRequest \*request = ...; [request setResultType:NSDictionaryResultType]; NSError \*error = nil; NSArray \*fetchResults = [_context executeFetchRequest:[self build] error:&error];