iPhone核心数据迁移失败,“无法找到源存储模型”

时间:2010-09-24 22:49:07

标签: ios iphone cocoa-touch core-data migration

我有一个使用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 个答案:

答案 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;
}