CoreDataを使用するアプリケーションがあります。プロジェクトに2つのデータモデルがあり、2つのモデルをマージしてManagedObjectContextを作成します。ここに私がそれを行うコードがあります:
- (NSManagedObjectModel *)managedObjectModel {
if (__managedObjectModel != nil) {
return __managedObjectModel;
}
NSURL* entityURL = [[NSBundle mainBundle] URLForResource:@"User_data" withExtension:@"momd"];
NSManagedObjectModel* entityModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:entityURL];
NSURL* whoURL = [[NSBundle mainBundle] URLForResource:@"WHO_data" withExtension:@"momd"];
NSManagedObjectModel* whoModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:whoURL];
NSArray* models = [NSArray arrayWithObjects:entityModel, whoModel, nil];
__managedObjectModel = [NSManagedObjectModel modelByMergingModels:models];
return __managedObjectModel;
}
エンティティの属性はいずれもオプションではなく、managedObjectContextを保存しようとするとアプリがクラッシュします。一部の属性が設定されていないためだと思います。親エンティティのawakeFromInsert:をオーバーライドしました:
- (void) awakeFromInsert
{
[super awakeFromInsert];
NSString* userCFUUID = [[NSUserDefaults standardUserDefaults]objectForKey:@"device_identifier"];
if ( userCFUUID ) {
[self cfuuid:userCFUUID];
} else {
[NSException raise:NSInvalidArgumentException format:@"Entry: awakeFromInsert: cannot find CFUUID"];
}
[self setCreationDate:[NSDate date]]; // the time since Jan 1st 1970 in seconds
[self setEventDate:[NSDate date]];
}
ただし、awakeFromInsert:は呼び出されません。ブレークポイントを設定し、NSManagedObjectを作成するステートメントからステップスルーしました。
LengthEntry *length1 = [NSEntityDescription insertNewObjectForEntityForName:@"LengthEntry" inManagedObjectContext:moc];
関連する場合と関連しない場合がある追加の事実:問題のあるエンティティを含むデータモデルを作成した後、Xcode機能を使用してクラスを自動的に作成しました。次に、モデルで他の方法を指定しなかったため、xcodeがクラスに複数形の名前を付けていることに気付きました(モデルでクラスを呼んでいたため)。そのため、「Entry.h」ではなく「Entries.h」になりました。戻ってすべてのクラスを手動で変更し、モデルでクラスの名前を指定しました。
したがって、awakeFromInsertが呼び出されない理由を理解する必要があります。