2009-05-11 12 views
9

コアデータを使用して書かれたアプリケーションがあります。私は1対多の関係を持つ2つのエンティティを持っています。私は両方のNSManagedObjectをサブクラス化しました。一方のエンティティはプレイリストと呼ばれ、もう一方はソングと呼ばれます。プレイリストのためのコアデータの多対多関係のプロパティ宣言

インタフェース:

@interface VBPlaylist : NSManagedObject { 
} 

@property (readwrite, copy) NSString *name; 

@end 

プレイリストの実装:

@implementation VBPlaylist 

@dynamic name; 

@end 

私はプレイリストのクラスの下で歌を示すために、別のプロパティを持つべきだと思います。私は、プロパティとして記述された多くの関係を示すサンプルコードを見つけることができません。これどうやってやるの?

+0

また、クラスの自動生成**が非常に簡単** [このブログの投稿](http://nvie.com/archives/263 "Core Dataデータモデルのクラスを自動的に生成する")をご覧ください。 – nvie

答えて

18

1対1の関係は、コアデータによってオブジェクト参照としてモデル化されます。だから、エンティティBazへのエンティティBarから対1の関係は、(BazクラスBazによって実装されると仮定して)

@interface Bar : NSManagedObject { 
} 

@property (readwrite,nonatomic) Baz * toBaz; 

@end 

対多の関係がないかのNSMutableSetとして(変更可能な設定プロパティとしてモデル化されているだろう)。 manyBazz呼ばBarからBazへ対多の関係を仮定:

@interface Bar : NSManagedObject { 

} 

@property (retain) NSSet* manyBazz; 

@end 

// coalesce these into one @interface AnalysisRecord (CoreDataGeneratedAccessors) section 
@interface Bar (CoreDataGeneratedAccessors) 
- (void)addManyBazzObject:(Baz *)value; 
- (void)removeManyBazzObject:(Baz *)value; 
- (void)addManyBazz:(NSSet *)value; 
- (void)removeManyBazz:(NSSet *)value; 

@end 

あなたがmanyBazz関係を操作するためNSMutableSetインターフェイスを使用したい場合は、あなたがmanyBazz関係についてKVO準拠のプロキシを取得するために-mutableSetValueForKey:@"manyBazz"を呼び出す必要があります。

Leopard(OS X 10.5)以降では、明示的に宣言または実装していない場合でも、すべての適切なメソッドが自動的にコアデータフレームワークによって実行時に生成されます(もちろん、コンパイラヘッダーファイルで宣言せずにそれらを使用しようとすると警告します)。したがって、あなたは、「設計 - から

宣言と実装の権利を取得する最も簡単な方法は、データ・モデラーの属性を選択し、「クリップボードにコピーのObjective-C 2.0メソッドの宣言」を選択することでサブクラス化することはない必要を行います>データモデル "メニューで、実装クラスの.hファイルに貼り付けます。もちろん、あなたは.hとモデルを同期させておく必要があります。したがって、rentzschの最高のMO Generatorは、あなたのデータモデルからNSManagedObjectサブクラスを自動的に生成(再生成)するツールです。

+0

この場合、BarにBazオブジェクトを追加したい場合、私はできる: [barInstance addManyBazzObject:bazInstance]またはbazInstance.bar = barInstance? – hekevintran

+0

はい、それは正しいです。 –

+0

あなたは最後の文章を終えるのを忘れたと思います。 –

16

あなたのCoreDataエンティティのための.hと.mファイルのファイルを作成する最も簡単な方法はこれです:

  1. データモデラー内のエンティティを選択します。
  2. Command-Nを押すか、File-> New Fileを選択してください。
  3. ソースリストから「Cocoa」を選択してください。
  4. テンプレートチューザでは、「Managed Object Class」という項目が表示されます。これがない場合は、[キャンセル]をクリックして手順1〜2を繰り返します。
  5. [次へ]を押して、プロジェクト/ターゲットを選択し、もう一度[次へ]を押します。
  6. 次のようなウィンドウが表示されます。New Managed Object Class window http://blog.alanquatermain.net/images/ManagedObjectClass.png
  7. 必要なオプションを選択し、[完了]をクリックします。

これは、次のヘッダーとソースファイルを生成します。

Entity.h:

​​3210

Entity.m:実装が含まれていないことを

#import "Entity.h" 


@implementation Entity 

@dynamic uniqueID; 
@dynamic name; 
@dynamic parent; 
@dynamic children; 

@end 

注意のマーカー以外のものは、プロパティに一致するメソッド/変数の欠落を気にしないようにコンパイラに指示します。

+0

クール。生成されたコードは、これを設定するための良い例になります。私は今日それをたくさん使ってきました。 –

2

これは少し変更されています。 4.2.1(2012年3月現在)から、新しいファイルに移動します。コアデータ(Cocoaではなく)を選択してから、新しいNSObjectModelサブクラスを選択します。そこから、上記のようにサブクラスが生成されます。

+0

また、file-> newではなく 'CMD + N' –