【问题标题】:iPhone CoreData migration fails with "Can't find model for source store"iPhone CoreData 迁移失败并显示“找不到源存储模型”
【发布时间】:2011-04-17 00:50:05
【问题描述】:

我有一个使用 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 中没有其他实体具有哈希 &lt;cc1456b7....&gt;

【问题讨论】:

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


    【解决方案1】:

    从链接的答案,

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

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

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

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

    【讨论】:

    • 我确实在运行应用程序后编辑了第 2 版。进行此操作的最佳方法是什么?我绝对不想将它发布到生产中并让用户丢失他们的数据,因为我在开发过程中搞砸了。我可以创建一个带有最终编辑的版本 3 并开始使用吗?
    • 如果您还没有向用户发布版本 2,那么他们不会有任何问题。您遇到问题是因为您使用“旧版本 2”保存并尝试使用“新版本 2”加载它。不过,添加新的不必要的模型版本并没有什么坏处;它只会让你的应用更大一点。
    • 优秀。我有点吓坏了,因为我们的一些内部测试人员遇到了错误,但很可能是因为我在运行具有多个更改的版本时遇到了同样的问题。
    【解决方案2】:

    在我的情况下,完全相同的事情正在发生,我在 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 2014-10-30
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多