2012-04-04 2 views
2

У меня есть приложение, которое использует 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 никогда не называется.

ответ

1

Из отчаяния я удалил классы данных и классы NSManagedObject. Затем я воссоздал модель и классы.

Теперь он работает. Возможно, что-то случилось, когда я вручную изменил имена классов.

+6

Я собираюсь бросить свои 2 цента, кажется типичным, что это происходит, когда добавление класса в объект в редакторе забыли. Это гарантирует, что пользовательская реализация никогда не будет использоваться, хотя определение сущности достаточно для основных данных, чтобы разделить хад в хранилище объектов. – Landern

+1

@Moses, для меня было действительно забыть установить класс для дочернего объекта. Благодаря! – phatmann

1

awakeFromInsert вызывается ровно один раз для каждого объекта при его создании.

Что вы хотите, это awakeFromFetch, чтобы он вызывался каждый раз, когда он загружается в память из магазина.

Много раз, вы хотите иметь тот же или похожий код в обоих местах.