У меня есть приложение, которое использует Core Data. У меня две модели данных в проекте, и я создаю ManagedObjectContext, объединив две модели. Вот код, где я могу это сделать:awakeFromInsert никогда не вызывал
- (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];
Дополнительного то, что может или не может быть relavent: После создания DataModel, содержащей сущность проблемы, я использовал функцию Xcode для автоматического создания классов. Затем я понял, что, поскольку я не указал, что в модели иначе, xcode назвал классы в множественном смысле (потому что это то, что я назвал ими в модели). Итак, я закончил с «Entries.h» вместо «Entry.h». Я вернулся и вручную изменил все классы и задал в модели имя классов.
Итак, мне нужно выяснить, почему awakeFromInsert никогда не называется.
Я собираюсь бросить свои 2 цента, кажется типичным, что это происходит, когда добавление класса в объект в редакторе забыли. Это гарантирует, что пользовательская реализация никогда не будет использоваться, хотя определение сущности достаточно для основных данных, чтобы разделить хад в хранилище объектов. – Landern
@Moses, для меня было действительно забыть установить класс для дочернего объекта. Благодаря! – phatmann