iOS – Core Dataで多対多のデータを扱う

データモデルで多対多の関係を扱うことはけっこう多かったりします。代表的なのが「ブログ記事」エンティティと「タグ」エンティティの関係がそれですね。ブログ記事は複数あり、またその記事には複数のタグが付けられ、かつタグは複数のブログ記事の間で重複して指定できるのでまさに多対多の関係にあるわけです。

今回はメモはそんな多対多のデータをCore Dataフレームワークで扱う方法についてのメモです。Core Dataを使うと多対多のデータ構造が非常に簡単に扱えます。やり方さえ一度覚えてしまえば後は楽ちんです。

 

データモデル

many_to_many_relation

左図に示すように、ブログ記事を表す「Blog」エンティティと、そのタグを表す「Tag」エンティティがある場合を例にとって解説します。

 

上記の2つのエンティティはそれぞれリレーションを持っています。BlogエンティティはTagエンティティの要素を複数持つことを表すリレーション「tags」を持ち、 同様にTagエンティティはBlogエンティティの複数要素を持つことを表すリレーション「blogs」を持っています。複数要素(多対)の指定は、下図のように、「To-Many Relationship」にチェックを入れることで指定できます。ポイントはBlogエンティティ、Tagエンティティの双方から互いに多対リレーションを設定するところです。

tags_relation

blogs_relation

 

BlogエンティティのManagedObjectサブクラスの作成

メニューから「File」→「New」→「File...」を選択し、下図のようにCore Dataのの「NSManagedObject subclass」を選択してBlogエンティティを扱うBlogクラスを作成します。この作業は上記のデータモデルのところでリレーションを設定した後にやってください。そうじゃないと自動生成されるソースを後で手直しすることになってしまいます。

ManagedObjectSubclassCreation

Blogクラスが自動生成されると、以下のようになっているはずです。

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface Blog : NSManagedObject

@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSSet *tags;
@end

@interface Blog (CoreDataGeneratedAccessors)

- (void)addTagsObject:(NSManagedObject *)value;
- (void)removeTagsObject:(NSManagedObject *)value;
- (void)addTags:(NSSet *)values;
- (void)removeTags:(NSSet *)values;

@end

上記のコードを見てみるとプロパティとしてtagsを持っています。このtagsを用いることでBlogオブジェクトに紐づくTagオブジェクトを参照できます。またaddTagsObjectメソッドなども生成されていることがわかります。

 

データの登録

ここまで来ればなんとなく予想がついているとは思いますが、あるBlogオブジェクトにTagオブジェクトを追加する(紐付ける)場合には以下のようなコードになります。

// blogObjはBlogエンティティに対応するNSManagedObjectのサブクラス
// tagObjはTagエンティティに対応するNSManagedObjectのサブクラス
[blogObj addTagsObject tagObj];

 

データの参照

あるBlogオブジェクトに紐付けられたTagオブジェクを参照したい場合は、Blogオブジェクトのtagsプロパティにアクセスします。例えば、あるBlogオブジェクトにどんなTagオブジェクトが紐付いているかログでみたいときには以下のようなコードになります。

for (Tag *tagObj in blogObj.tags) {
  NSLog(@"%@", tagObj.name);
}

解説は以上となります。

いや〜しかしCore Dataよくできてますね。最初さわったときは「なんだこれ?記述量多すぎ!わけわからん!」てな感じでしたが、リファレンスを読めば読むほど「こんなことまで自動でやってくれるんだ!すごい!」という感想に変わりつつあります。

 

環境
XCode 4.6

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です