iPhone CoreData迁移失败,"无法找到源存储的模型"

Col*_*ber 8 migration iphone cocoa-touch core-data ios

我有一个使用CoreData的iPhone应用程序.我最近对数据模型做了一些小改动,现在每次打开应用程序时都会收到错误"无法找到源存储模型".

我有2个版本的数据模型,我所做的唯一更改是添加了一些字段.我正在按照这里最初工作的指南,然后就在今天,在添加一些额外的字段后,它会中断.所有其他字段都标记为可选,并且都具有默认值.迁移代码如下:

NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"xxx.sqlite"]];

// migration options
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

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

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
...
}
Run Code Online (Sandbox Code Playgroud)

在这里成功创建了managedObjectModel:

- (NSManagedObjectModel *)managedObjectModel {

if (managedObjectModel != nil) {
    return managedObjectModel;
}

NSString *path = [[NSBundle mainBundle] pathForResource:@"DataModelName" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

return managedObjectModel;
}
Run Code Online (Sandbox Code Playgroud)

我已经将该问题追溯到版本对于1个实体的不匹配.抛出的错误包括对实体的错误:

MyEntityName = <cc1456b7 b12d0d05 21930308 94ccc078 27a6c345 8847c738 e3a9ae7e 0be9535d>;
Run Code Online (Sandbox Code Playgroud)

但是应用程序包中的VersionInfo.plist中的哈希是:

MyEntityName = <fede6b59 462442d1 8fc98226 b9f8f745 3250dabd ee188248 cb97b1d0 8a74eef3>;
Run Code Online (Sandbox Code Playgroud)

VersionInfo.plist中没有任何其他实体带有散列<cc1456b7....>.

tc.*_*tc. 5

从链接的答案,

这看起来很棒,也很简单 - 但我觉得在更改模型时需要在开发过程中小心 - 否则你将不得不为每次更改创建一个新版本.

听起来你制作版本2,编辑版本2,运行应用程序,再次编辑版本2,然后再次运行应用程序.这不是很好; 您需要保存您希望能够打开的所有模型版本.这有点麻烦.

您可以做的是在应用版本之后命名所有模型,例如对应于版本的FooModel-1和FooModel-1.1,以及用于"开发"版本的FooModel-1.2d1,FooModel-1.2d2.在发布之前,您可以将FooModel-1.2d10重命名为FooModel-1.2并删除其他开发版本.

(或者我可能完全误读了这个问题;对不起.)