ページ

2009年11月13日金曜日

CoreData - NSManagedObject のプロパティ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

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