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

Posted

技术标签:

【中文标题】此 NSPersistentStoreCoordinator 没有持久存储(架构不匹配或迁移失败)。它无法执行保存操作【英文标题】:This NSPersistentStoreCoordinator has no persistent stores (schema mismatch or migration failure). It cannot perform a save operation 【发布时间】:2016-03-21 11:57:46 【问题描述】:

我正在开发一个使用 x.x.xcdatamodel 的应用程序。现在在同一个 x.x.xcdatamodel 中,我在其中一个实体中添加了一个属性。应用程序崩溃并显示消息“。”。我尝试了很多事情,我也在使用轻量级迁移来处理这种情况,但效果不佳。下面是我的代码:

    - (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】:

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

您可以通过在 Xcode 的文件浏览器中选择 xcdatamodel 模型文件,进入“编辑器”菜单,然后选择“添加模型版本...”来创建一个新版本

【讨论】:

所以每当我想向实体添加新属性并想将更新上传到商店时,我必须创建一个新的数据模型吗?哪怕只是一点点零钱? 是的,每次更改数据模型时。通常数据模型不会频繁更改,如果他们经过仔细规划的话。 好的,谢谢你的帮助,希望通过添加新版本可以解决这个问题,问题是我们无法在我的最后重现它,但应用程序对用户来说崩溃了,所以它我有点难以确定。 @uzairdhada 我知道这是一个老问题,但希望这会有所帮助。当您发布使用 CoreData 的应用程序的新版本时,您总是需要进行升级测试。测试从旧版本升级到新版本的应用程序会为您重现此崩溃。 我不小心在旧版本的代码数据而不是新版本中添加了属性。我从旧模型中删除了这些属性,但现在有同样的错误。【参考方案2】:

我在一个项目上工作并遇到了类似的问题,似乎前开发人员忘记通过这两个选项进行轻量级迁移。第二个通过了,迁移成功。

您使用传入addPersistentStoreWithType:configuration:URL:options:error: 的选项字典请求自动轻量级迁移,方法是将与NSMigratePersistentStoresAutomaticallyOptionNSInferMappingModelAutomaticallyOption 键对应的值设置为YES

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.

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于此 NSPersistentStoreCoordinator 没有持久存储(架构不匹配或迁移失败)。它无法执行保存操作的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到此错误:“不支持此功能(数字商品)。”?

此项目引用此计算机上缺少的 NuGet 包。

为啥我看到“此应用程序不支持此设备的 CPU 类型”?

为啥在运行此 OpenCV 程序时出现此异常?

Testflight:此版本与此设备不兼容

无法启动此程序,因为计算机中丢失VCRUNTIME140.dll 尝试重新安装此程序以解决此问题