我有一个使用CoreData的iPhone应用程序。我最近对数据模型进行了一些小的更改,现在每次打开应用程序时,都会出现错误“找不到源存储的模型”。
我有2个版本的数据模型,而我所做的唯一更改是对某些字段的一些补充。我遵循的是here指南,该指南最初有效,然后直到今天,在添加了一些其他字段之后,它中断了。所有其他字段都标记为可选,并且都具有默认值。迁移代码如下:
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]) {
...
}
此处成功创建了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;
}
我已将问题归结为1个实体的版本不匹配。引发的错误包括实体所具有的错误:
MyEntityName = <cc1456b7 b12d0d05 21930308 94ccc078 27a6c345 8847c738 e3a9ae7e 0be9535d>;
但该应用程序捆绑包的VersionInfo.plist中的哈希为:
MyEntityName = <fede6b59 462442d1 8fc98226 b9f8f745 3250dabd ee188248 cb97b1d0 8a74eef3>;
在VersionInfo.plist中的任何地方都没有其他实体,带有哈希
<cc1456b7....>
。 最佳答案
从链接的答案中,
听起来您已经制作了版本2,已编辑版本2,已运行该应用程序,再次编辑了版本2,然后再次运行了该应用程序。这不是很好。您需要保存您希望能够打开的所有模型版本。这有点麻烦。
您可以做的就是以应用程式版本命名所有型号,例如对应于发行版的FooModel-1和FooModel-1.1,以及用于“开发”版本的FooModel-1.2d1,FooModel-1.2d2。在发布之前,您可以将FooModel-1.2d10重命名为FooModel-1.2并删除其他开发版本。
(或者我可能完全误解了这个问题;对不起。)