9

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

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

4

3 回答 3

14

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

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

于 2016-03-21T20:09:59.033 回答
2

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

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

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.
}
于 2019-04-14T11:13:13.757 回答
0

就我而言,我更改了包裹xcdatamodel内部的名称xcdatamodeld。我需要恢复名称更改以消除错误。

于 2021-01-06T12:49:50.407 回答