CoreData のエンティティを扱う場合、NSManagedObjectから派生した専用のデータモデルクラスを作り、属性をプロパティ経由で扱えると便利だ。今回はその方法の覚え書き。
(参考)Mac Dev Center: Core Data Programming Guide: Managed Object Accessor Methods
プロパティを使わない場合
こんなエンティティを用意した。
NSManagedObject* history = [NSEntityDescription insertNewObjectForEntityForName:@"History" inManagedObjectContext:managedObjectContext]; [history setValue:@"TEST IMAGENAME" forKey:@"imagename"]; [history setValue:@"TEST LINK" forKey:@"link"]; [history setValue:@"TEST TITLE" forKey:@"title"];
プロパティを使う場合
まずエンティティ用のクラスを定義する。
History.h
@interface History : NSManagedObject { } @property (nonatomic, retain) NSString * imagename; @property (nonatomic, retain) NSString * link; @property (nonatomic, retain) NSString * title; @end
History.m
@implementation History
@dynamic imagename;
@dynamic link;
@dynamic title;
@end
@dynamic を使うのがミソ。メンバ変数の定義をしていないが実行時にNSManagedObjectの値がプロパティへ自動的に割当られる。コンパイル時に Warning も出ない(@synthesize を指定するとメンバ変数が無いので怒られる)。
利用する側はこんな感じ。
@import "History.h" : History* history = [NSEntityDescription insertNewObjectForEntityForName:@"History" inManagedObjectContext:managedObjectContext]; history.imagename = @"TEST IMAGENAME"; history.link = @"TEST LINK" forKey:@"link"; history.title = @"TEST TITLE" forKey:@"title";
いい感じだ。
参考情報
@dynamic に関する話題など
@synthesize vs @dynamic, what are the differences? - Stack Overflow