【问题标题】:mapping model is NULL - core data migration映射模型为 NULL - 核心数据迁移
【发布时间】:2012-07-17 00:20:35
【问题描述】:

我按照这个不错的教程http://mipostel.com/index.php/home/70-core-data-migration-standard-migration-part-2 进行核心数据迁移。

由于某些奇怪的原因,我在 mappingModel 中总是在这些行中得到 NULL:

 NSMappingModel *mappingModel = [NSMappingModel mappingModelFromBundles:nil
                                                                forSourceModel:sourceModel
                                                              destinationModel:destinationModel];

(链接代码中的第 191 行)

我尝试创建一个非常简单的模型派生版本,我重新创建了一个 mappingModel 1000 次,确保映射模型文件位于项目目录中 - 但此调用始终返回 NULL。

有人知道这里出了什么问题吗?

ps 我只是想知道在使用映射模型之后会调用设置迁移选项。

   NSURL *storeUrl = [NSURL fileURLWithPath:storePath];   
    NSError *error;   
    NSDictionary *pscOptions = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                                [NSNumber numberWithBool:NO], NSInferMappingModelAutomaticallyOption,
                                nil];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                  configuration:nil
                                                            URL:storeUrl
                                                        options:pscOptions
                                                          error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }   

(第 123 行...)

无论如何

为什么找不到映射模型?

pss 忍不住 :-) 与进行简单的 SQL DB 迁移相比,这个核心数据迁移的东西太复杂和困难了——浪费了太多时间。

提前非常感谢!

【问题讨论】:

  • 实际上,事实证明该教程似乎有问题 - 所以在浪费时间之前尝试找到另一个教程.... :-()

标签: core-data xcode4.3 ios5.1 core-data-migration


【解决方案1】:

我遵循相同的教程,最终不得不通过 URL 手动打开我的映射模型

  NSString *mappingModelPath = [[NSBundle mainBundle] pathForResource:@"mappingModel10" ofType:@"cdm"];
    NSLog(@"mapping model path:%@", mappingModelPath);
    NSURL *mappingModelUrl = [NSURL fileURLWithPath:mappingModelPath];
    NSMappingModel *mappingModel = [[NSMappingModel alloc] initWithContentsOfURL:mappingModelUrl];

我通过查看我的应用程序包找到了我的映射模型的文件名。

【讨论】:

  • 非常感谢 - 希望这也能帮助其他人避免浪费这么多时间。 !顺便说一句,其余的工作正常吗?我发现在代码检查是否需要迁移之后设置迁移选项真的很奇怪。这也是我最终选择另一条路线的另一个原因......
  • 我不得不对那个教程中的代码进行了相当多的修改,但它让我走上了正轨。我正在写一篇关于我的迁移过程的博客文章,完成后我会在此处发布一个链接。
  • 为什么在迁移之后设置选项会很奇怪?这些选项仅在 addPersistentStoreWithType 中使用,它们与自定义迁移无关。它们甚至可以为 nil,因为它们将用于默认迁移,因为此处执行的迁移是自定义的。 Apple 还表示在 addPersistentStoreWithType 中检查迁移是昂贵的,并建议在之前使用 isConfiguration:compatibleWithStoreMetadata,所以这就是为什么在 addPersistentStoreWithType 之前检查是有意义的;)
  • @JesseCrocker 为什么是ofType:@"cdm" 而不是`ofType:@"xcmapingmodel"?
  • @Colas .xcmappingmodel 文件被编译成 .cdm 文件,即二进制 plist 文件。
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多