CoreDataの小技〜NSDictionaryとNSManagedObjectの相互変換など

CoreDataについて、幾つか小技があるのでメモ。

該当件数を取得する

SQLに於けるcount文です。

1
NSManagedObjectContext \*context = ...; NSFetchRequest \*request = ...; NSError *error = nil; NSUInteger count = [context countForFetchRequest:request error:&error];

最大値取得

本来はNSExpressionDescriptionを使うべきなのでしょうが、ソースが長くなるので order … limit 1 で代用できます。 idの最大値を取る場合

1
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からデータを代入する

1
Book * book = ... ; // BookはNSManagedObjectのサブクラス NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys: @"life",@"title", @"wicket",@"auther", nil]; [book setValuesForKeysWithDictionary:dic];

逆にNSManagedObjectからNSDictionaryとしてデータを取り出す

1
NSDictionary *dic = [book dictionaryWithValuesForKeys:[[[book entity] attributesByName] allKeys]];

最初からNSDictionaryでデータを取得する

1
NSManagedObjectContext \*context = ...; NSFetchRequest \*request = ...; [request setResultType:NSDictionaryResultType]; NSError \*error = nil; NSArray \*fetchResults = [_context executeFetchRequest:[self build] error:&error];