9

xxxcdatamodel を使用しているアプリケーションに取り組んでいます。同じ xxxcdatamodel で、エンティティの 1 つに属性を追加しました。アプリケーションがクラッシュし、「この NSPersistentStoreCoordinator には永続ストアがありません (スキーマの不一致または移行の失敗)。保存操作を実行できません。」というメッセージが表示されます。私は多くのことを試しましたが、状況を処理するために軽量の移行も使用していますが、それもうまくいきません.以下は私のコードです:

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

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

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSDictionary *options = @{
                              NSMigratePersistentStoresAutomaticallyOption : @YES,
                              NSInferMappingModelAutomaticallyOption : @YES,
                              NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"}
                              };

    if(![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }

    return __persistentStoreCoordinator;
}




- (BOOL) saveContext
{
    @synchronized (_localStorage) {
        //NSLog(@"----------------------------Save context called---------------------------");
        BOOL result = TRUE;
        NSError *error = nil;
        NSManagedObjectContext *managedObjectContext = self.managedObjectContext;

        if (managedObjectContext != nil)
        {
            //Crashes here at this line.
            if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
            {
                NSLog(@"----------------------------Save context failed---------------------------");
                result = FALSE;
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            }
        }

        //NSLog(@"----------------------------Save context completed---------------------------");

        return result;
    }
}

ここで何か不足していますか?または、エンティティに 1 つの属性を追加しても、完全な移行を実行する必要があるようですか?よろしくお願いします。

4

3 に答える 3

14

ここで移行を自分で行う必要はありません。新しいバージョンのデータ モデルを追加する必要があります。を編集してxcdatamodel、Core Data が新しいバージョンを使用することを期待することはできません。既存のモデルを保持し、新しいバージョンを作成して、新しいバージョンで変更を加える必要があります。永続ストア ファイルと一致するモデルのバージョンが常に必要です。

新しいバージョンを作成するにはxcdatamodel、Xcode のファイル ブラウザーでモデル ファイルを選択し、[エディター] メニューに移動して、[モデル バージョンの追加...] を選択します。

于 2016-03-21T20:09:59.033 に答える