表示されている問題は、連想ストレージと呼ばれるNSManagedObjectクラスの動作が原因で発生します。
連想ストレージは基本的に、一般的なNSManagedObjectを、割り当てられたエンティティのプロパティの名前をキーとするディクショナリに変換します。辞書やその他のKey-Value準拠クラスの場合と同じように、キーの値を設定してアクセスします。したがって、次のような汎用管理対象オブジェクトを使用する場合:
NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext];
str
...データモデルで定義されたエンティティのキーを持つ汎用NSManagedObjectインスタンスを取得します。したがって、Key-Valueコーディングを使用して、汎用NSManagedObjectインスタンスに値を格納できる場合は次のようになります。
[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value];
またはより明確に次のようなもの:
[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:@"anAttributeName"];
ただし、ドット表記は別のものです。呼び出すEvent.anAttributeName
ときは、NSManagedObjectのカスタムサブクラス内のメソッドを呼び出しています。これを機能させるには、名前を使用してカスタムサブクラスを生成し、それをデータモデルのエンティティにEvent
割り当てる必要があります。Event
ドット表記を使用すると、次のようなメソッドを呼び出すことになります。
-(void) setAnAttributeName:(NSNumber *) aNumber{
//some boilerplate
[self setPrimativeValue:aNumber forKey:@"anAttributeValue"];
// some more boilerplate
}
メソッドを自分で作成することも、@dynamic
コンパイラ指令を使用して実行することもできますが、どちらの場合も、メソッドが必要です。メソッドもドット表記もありません。
Core Dataを学習しているだけの場合は、汎用のNSManagedObjectsを使用setValue:forKey:
して、カスタムのNSManagedObjectサブクラスに移動するのが最適です。