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;
@endHistory.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

