1

最初のCoreDataアプリをビルドしようとしていますが、起動時に次のエラーでアプリがクラッシュすると問題が発生します。

*** 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正しく構成されていないために一般的に発生するエラーを収集しましたが、自分のコードでそのようなエラーを見つける方法がわかりません。

私の中には次の3つの関数があります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;
}

訓練を受けていない目には、CoreDataオブジェクトが適切に構成されているように見えます。

Launchpadというエンティティをファイルに追加し、から派生しxcdatamodeldた対応するクラスに接続しました。LaunchpadNSManagedObject

クラッシュの原因となっているコードのスニペットは次のとおりです。

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 に答える