Xcode 此NSPersistentStoreCoordinator没有持久存储(架构不匹配或迁移失败)。它无法执行保存操作

Xcode 此NSPersistentStoreCoordinator没有持久存储(架构不匹配或迁移失败)。它无法执行保存操作,xcode,core-data,core-data-migration,xcdatamodel,Xcode,Core Data,Core Data Migration,Xcdatamodel,我正在开发一个使用x.x.xcdatamodel的应用程序。现在,在同一个x.x.xcdatamodel中,我在其中一个实体中添加了一个属性。应用程序崩溃,显示消息“此NSPersistentStoreCoordinator没有持久存储(架构不匹配或迁移失败)。它无法执行保存操作。”。我尝试了很多方法,我也在使用轻量级迁移来处理这种情况,但效果并不理想。下面是我的代码: - (NSPersistentStoreCoordinator *)persistentStoreCoordinato

我正在开发一个使用x.x.xcdatamodel的应用程序。现在,在同一个x.x.xcdatamodel中,我在其中一个实体中添加了一个属性。应用程序崩溃,显示消息“此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;
    }
}

我是不是错过了什么?或者,即使我在实体中添加了一个属性,我也必须执行完整的迁移吗?请提前感谢。

在这里,您不必自己进行迁移。您必须添加新版本的数据模型。您不能编辑
xcdatamodel
并期望核心数据只使用新版本。您需要保留现有模型,创建新版本,并在新版本中进行更改。您必须始终拥有与持久存储文件匹配的模型版本


通过在Xcode的文件浏览器中选择
xcdatamodel
model文件,进入“编辑器”菜单,然后选择“添加模型版本…”来创建一个新版本。我正在处理一个项目,遇到了一个类似的问题,以前的开发人员似乎忘记了传递这两个轻量级迁移选项。我通过了第二个测试,迁移成功完成

使用传入的选项字典请求自动轻量级迁移
addPersistentStoreWithType:configuration:URL:options:error:
,通过将与
NSMigratePersistentStoresAutomaticallyOption
NSInferMappingModelAutomaticallyOption
键对应的值设置为
YES


在我的例子中,我更改了
xcdatamodeld
包中
xcdatamodel
的名称。我需要恢复名称更改以删除错误。

因此,每当我想向实体添加新属性并想将更新上载到存储中时,我都必须创建新的数据模型?即使只是一个小小的改变?是的,每次你改变数据模型。通常情况下,如果数据模型经过仔细规划,它们不会经常更改。好的,谢谢你的帮助,希望通过添加新版本,这个问题会得到解决,问题是我们无法在我的终端复制它,但应用程序正在为用户崩溃,所以我很难确定。@uzairdhada我知道这是一个老问题,但希望这会有所帮助。在发布使用CoreData的新版本应用程序时,您始终需要进行升级测试。测试从旧版本升级到新版本的应用程序可能会为您重现此崩溃。我不小心在旧版本的代码数据中添加了属性,而不是新版本。我从旧模型中删除了这些属性,但现在有相同的错误。
NSError *error = nil;
NSURL *storeURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel]
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

BOOL success = [psc addPersistentStoreWithType:NSSQLiteStoreType
                configuration:nil URL:storeURL
                options:options error:&error];
if (!success) {
  // Handle the error.
}