1

我正在尝试构建我的第一个 Core Data 应用程序,但是当应用程序崩溃并出现以下错误时,我在启动时遇到了问题:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an entity named 'Launchpad' in this model.'
*** First throw call stack:
(0x15b7012 0x13dce7e 0x6f4c5 0x3e0f 0x3c64 0xee05c8 0xe4802a 0xe15d23 0xe15a34 0xea2301 0x21ba53f 0x21cc014 0x21bc7d5 0x155daf5 0x155cf44 0x155ce1b 0x24037e3 0x2403668 0x32465c 0x2abd 0x29e5 0x1)
libc++abi.dylib: terminate called throwing an exception

我一直在研究这个错误,我收集了通常是因为我没有正确配置managedObjectModel错误,但我不确定如何在我自己的代码中发现这样的错误。

我的 中有以下三个功能AppDelegate

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel
{
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Orbiter" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Orbiter.sqlite"];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}

在我未经训练的眼睛看来,我的核心数据对象似乎已正确配置。

我在我的xcdatamodeld文件中添加了一个名为 Launchpad 的实体,并将其连接到对应的类,该类Launchpad派生自NSManagedObject.

导致崩溃的代码片段是

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSManagedObject *launchpad = [NSEntityDescription insertNewObjectForEntityForName:@"Launchpad" inManagedObjectContext:context];

最后一行是事情偏离轨道的地方。

我环顾四周,我发现的所有帮助都表明我添加了我已经拥有的功能AppDelegate,所以我真的不知道从这里去哪里。

4

1 回答 1

2

每当您更改数据模型时,这总是会成为一个问题,一种简单的方法是更改​​您的代码以自动迁移数据,而无需您总是重新安装应用程序并丢失您已经填充的数据。

在您创建持久存储的地方,您可以执行类似的操作,它会自动为您移动新模型的数据,并确保您不会丢失所有旧数据。如果您想将旧模型显式映射到新模型,可以阅读托管对象映射。

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
于 2013-01-09T21:50:39.130 回答