我有一个使用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....>
。
答案 0 :(得分:5)
来自链接的答案,
这看起来很棒,也很简单 - 但我认为在更改模型时你需要在开发过程中小心 - 否则你将不得不为每次更改创建一个新版本。
听起来你制作版本2,编辑版本2,运行应用程序,再次编辑版本2,然后再次运行应用程序。这不是很好;您需要保存所有您希望能够打开的模型版本。这有点麻烦。
您可以做的是在应用版本之后命名所有模型,例如对应于发布的FooModel-1和FooModel-1.1,以及用于“开发”版本的FooModel-1.2d1,FooModel-1.2d2。在发布之前,您可以将FooModel-1.2d10重命名为FooModel-1.2并删除其他开发版本。
(或者我可能完全误读了这个问题;抱歉。)
答案 1 :(得分:0)
在我的情况下,完全相同的事情正在发生,我在iOS 7上,这个问题至少让我头脑干了一个星期,然后终于找到适合我的解决方案 。 为了使它工作,你必须在用于添加PersistentStore的选项中添加额外的值,然后你去(我不确定其他iOS版本,但是它肯定会在iOS 7上运行)。
-(NSManagedObjectModel *)managedObjectModel
{
if (managedObjectModel != nil)
{
return managedObjectModel;
}
managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return managedObjectModel;
}
-(NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (persistentStoreCoordinator != nil)
{
return persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ABC.sqlite"];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] ini tWithManagedObjectModel:[self managedObjectModel]];
//Creating Lightweight migration.
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]);
abort();
}
return persistentStoreCoordinator;
}