我有一个使用 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 永远不会被调用。