いつもmogeneratorを使ってCoreDataのモデルクラスを生成して利用している。
mogeneratorはPersonというNameのEntityがあった場合には、

  • Person.(h|m)
  • _Person.(h|m)

と4種類のファイルを生成する。

_Person.(h|m)には、基本的にいじる必要のない便利メソッドやモデルクラスっぽいプロパティ等が定義される。 Entityを更新等して再生成した時に上書きされるので、手動で変更する必要はない。


    + (id)insertInManagedObjectContext:(NSManagedObjectContext*)moc_;
    + (NSString*)entityName;
    + (NSEntityDescription*)entityInManagedObjectContext:(NSManagedObjectContext*)moc_;
    - (FoodModelID*)objectID;

Person.(h|m)の方はデフォルトは_Personのサブクラスとなっていて、必要に応じた拡張を書くクラスとなっている。

本題

自分の場合は、いつもEntityに

identifier

というUUIDを入れておく属性を作っている。

Skitched 20121003 174316

Entity Attribute

この

identifier

には 毎回CFUUIDCreateで作った値を入れているが、それを自動的に行うようにするために、Person.m

<em>-(void)awakeFromInsert</em>

を実装する。

awakeFromInsert は Entity作成時に自動的に呼ばれるメソッドなので、 Person.mのawakeFromInsert内で、次のようにself.identifierにUUIDを入れるような処理を書いておく。


- (void)awakeFromInsert {
    [super awakeFromInsert];
    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
    NSString *uuidStr = (__bridge_transfer NSString *) CFUUIDCreateString(kCFAllocatorDefault, uuid);
    CFRelease(uuid);
    self.identifier = uuidStr;
}

こうすることで、Entityがインスタンス化された時に自動的にidentifierがセットされた状態で手に入るようになる。
identifierを設定するメリットは後からそのインスタンスを引くときに便利になるため、基本的にあった方が楽になる。
(デフォルトであってもいい気がするけど、何ももっといい方法が用意されているのかな)

 

 

Post Navigation