スコットが言及したブログは、MagicalRecordを使用する人にとって必読です。
さらに、デフォルト+ (id) importFromObject:(id)data
が一部のNSDictionaryデータで機能しない場合は- (BOOL) importValuesForKeysWithObject:(id)objectData
、NSManagedObjectサブクラスのメソッドをいつでもオーバーライドして、マッピングを正確に制御できます。
これが私の最近のプロジェクトの1つからの抜粋です:
// override MagicalRecord's implementation with additional set up for Dialogue relationship
- (BOOL) importValuesForKeysWithObject:(id)objectData {
BOOL result = [super importValuesForKeysWithObject:objectData];
// update lesson-dialogue data
id dialogueDicts = [objectData objectForKey:@"dialogue"];
if ([dialogueDicts isKindOfClass:[NSArray class]]) {
for (id dialogueDict in dialogueDicts) {
DialogueSentence *dialogue = [DialogueSentence findFirstByAttribute:@"id" withValue:[[dialogueDict objectForKey:@"id"]];
if (dialogue == nil) {
dialogue = [DialogueSentence createEntity];
}
[dialogue importValuesForKeysWithObject:dialogueDict];
[self addDialoguesObject:dialogue]; // connect the relationship
}
}
return result;
}
ちなみに、NSManagedObjectサブクラスのカテゴリを作成し、そこにオーバーライドコードを記述したい場合があります。これは、Core DataモデルバージョンをアップグレードしてNSManagedObjectサブクラスを再生成するときに、独自のコードが消去されないためです。