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

2011/10/26 日常

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]; 
img_show