Edited at

CoreDataの一対多関連(One To-Many Relationship)

More than 5 years have passed since last update.

最初つまづいたのでメモって公開しておく



.xcdatamodeldファイルを編集する


  • Add Entityで親になるモデルと子になるモデルをつくる

  • Relationshipsの部分で+ボタンを押して、それぞれのモデルでお互いへの関連をつくる。親から子への関連は複数形にしておくとわかりやすい

  • Inverse(逆関連)にも、お互いを指定しておく


  • インスペクタを開き、親モデルのRelationshipsの行を選択した状態でTo-Many Relationshipにチェックをつける

  • インスペクタを開き、子モデルのRelationshipsの行を選択した状態でCount Minimum, Maximumを両方1にする


  • TODO: Delete Ruleについても書く




モデルのクラスを定義する


  • NewFileから、左側の一覧でCoreDataを選び、NSManagedObject subclassを選択する

  • Nextを押して、前項で編集していた.xcdatamodeldであることを確認し、生成する

これで自動的に、.xcdatamodeldで定義した親子関係を持ったNSManagedObjectが作られる



関連付けして保存する部分

親モデルに、関連定義した子を追加(関連付け)するための便利メソッドが生成されているのでそれを使う

クラスメソッドとインスタンスメソッドを混同してコールすると変なことになるので変数名のつけ方に注意

        // 親 Modelを生成

Photo *photo = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:self.managedObjectContext];

for (UILabel *label in [imageView subviews]) {
// 子 Modelを生成
Label *labelData = [NSEntityDescription insertNewObjectForEntityForName:@"Label" inManagedObjectContext:self.managedObjectContext];
[labelData setValue:label.text];
// 子 を 親 Modelに追加
[photo addLabelsObject:labelData];
};

ここではforで一個づつ追加しているが、NSSetになったオブジェクトを一度に追加するメソッドも生成されている