awakeFromInsert从未调用过

时间:2012-04-04 03:36:34

标签: iphone objective-c ios core-data

我有一个使用Core Data的应用程序。我在项目中有两个数据模型,我通过合并两个模型来创建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以复数形式命名类(因为这就是我在模型中称之为的)。所以,我最终得到了“Entries.h”而不是“Entry.h”。我回去并手动更改了所有类,并在模型中指定了类的名称。

所以,我需要弄清楚为什么永远不会调用awakeFromInsert。

2 个答案:

答案 0 :(得分:1)

awakeFromInsert在每个对象首次创建时都会被调用一次。

你想要的是awakeFromFetch,以便每次从商店加载到内存中时都会调用它。

很多时候,你想在两个地方都使用相同或类似的代码。

答案 1 :(得分:1)

出于绝望,我删除了datamodel和NSManagedObject类。然后我重新创建了模型和类。

现在,它有效。当我手动更改类的名称时,必定会发生一些麻烦。