Core data 如何在不损坏Xcode4的情况下正确更新模型?

Core data 如何在不损坏Xcode4的情况下正确更新模型?,core-data,data-migration,nspersistentdocument,Core Data,Data Migration,Nspersistentdocument,我在使用Xcode3时从来没有遇到过任何问题,但在使用Xcode4时,当我更新核心数据模型时,我发现苹果的代码在3次中失败了大约1次,出现了可怕的“持久存储迁移失败,缺少源管理对象模型”错误 以下是我的设置(我是如何将项目配置为自动迁移的): NSPersistentDocument,来自苹果的模板 重写Apple的模型加载方法,我唯一要做的就是在storeOptions字典中提供两个标志,这将启用自动迁移 下面是我一直在使用的过程(已经解决了Xcode4中的1个bug!) 选择模型(在Xcod

我在使用Xcode3时从来没有遇到过任何问题,但在使用Xcode4时,当我更新核心数据模型时,我发现苹果的代码在3次中失败了大约1次,出现了可怕的“持久存储迁移失败,缺少源管理对象模型”错误

以下是我的设置(我是如何将项目配置为自动迁移的):

  • NSPersistentDocument,来自苹果的模板
  • 重写Apple的模型加载方法,我唯一要做的就是在storeOptions字典中提供两个标志,这将启用自动迁移
  • 下面是我一直在使用的过程(已经解决了Xcode4中的1个bug!)

  • 选择模型(在Xcode4中名为“something.xcdatamodel”,左侧有一个扭曲的符号)
  • 进入编辑器菜单,选择“添加新模型版本…”
  • 将新版本1的整数命名为高于上一版本的整数-例如,如果上一版本为“4”,则将新版本命名为“5”
  • 在右侧窗格中,将当前模型版本更改为新创建的版本
  • XCode4错误的解决方法:选择任何文件,然后选择新创建的模型。如果不这样做,Xcode将在新创建的模型上显示所选内容,但会编辑以前的模型,这肯定会破坏CoreData中的所有内容
  • 编辑你的模型;在本例中,我将向现有实体添加一个新属性
  • 保存。建造。跑撞车
  • 除此之外,正如我所说,大约2倍于3,这是正确的。一旦它工作一次,它(显然)就好了——轻量级迁移完成了,下一次保存将保存到新的模型版本中

    所以我猜在上面的步骤中我做错了什么,但是我已经阅读了5到6次文档,看不到任何明显的东西。虽然NSPersistentDocument文档都过时了,但是我也在iPhone上做过很多次轻量级迁移,所以我对这样做很有信心,我觉得这是对的


    我尝试/检查过的其他事项:
    -(没有;只包括根xcdatamodel)

    既然您已经消除了一个损坏的开发存储作为问题的根源,我怀疑问题在于Xcode 4.x,至少可以说它有缺陷。很多人都在报告类似的问题,但没有两个问题看起来完全相同。这可能是一个只在特定数据模型设置中出现的bug,因此很难找到问题

    您可能只需要放弃自动迁移并创建显式迁移映射。它需要更长的时间,并将复杂性引入到代码中,但它始终有效


    如果您有一个配送应用程序,并且将在野外处理最终用户数据,那么您确实有道德和商业义务采取额外措施保护最终用户数据

    使用
    [NSNumber numberWithBool:YES]
    而不是
    @“YES”
    @“TRUE”

    我感到非常困惑,但这并没有起作用。。因为我假设该方法已经有了一个“存储选项”字典。。在设置上述选项之前,我只需要检查它是否存在

    -(BOOL)configurePersistentStoreCoordinatorForURL:       (NSURL*)u
                                              ofType:    (NSString*)t
                                  modelConfiguration:    (NSString*)c
                                        storeOptions:(NSDictionary*)o 
                                               error:    (NSError**)e 
    {  
     return [super configurePersistentStoreCoordinatorForURL:u
                                                      ofType:t
                                          modelConfiguration:c
                                                storeOptions:
        o ? [o dictionaryWithValuesForKeys:
             @[ NSMigratePersistentStoresAutomaticallyOption, @YES,  
                NSInferMappingModelAutomaticallyOption,       @YES]] 
          :  @{ NSMigratePersistentStoresAutomaticallyOption :@YES,
                NSInferMappingModelAutomaticallyOption       :@YES}
                                                      error:e];
    }
    

    崩溃是否产生任何错误?您是否尝试迁移开发版本?您是否反复使用存储的同一副本,还是每次都以新副本开始?只有“持久迁移失败错误”您如何迁移“新副本”存储?当然这是不可能的-没有什么可以迁移的?我想你可能是对的-在Xcode4处理CoreData的过程中有很多明显的错误。我只是希望有一些明显的我做错了的事情——这比不得不“希望并等待”苹果来修复要好得多。为什么会有什么不同呢?NSString的[boolValue]是内置的,其计算结果与您提供的代码完全相同。[NSNumber numberWithBool:x]不会对NSString调用boolValue,应为布尔值。它的评估结果总是正确的。例如,numberWithBool:@“否”理论上仍然是“是”(真)。
    -(BOOL)configurePersistentStoreCoordinatorForURL:       (NSURL*)u
                                              ofType:    (NSString*)t
                                  modelConfiguration:    (NSString*)c
                                        storeOptions:(NSDictionary*)o 
                                               error:    (NSError**)e 
    {  
     return [super configurePersistentStoreCoordinatorForURL:u
                                                      ofType:t
                                          modelConfiguration:c
                                                storeOptions:
        o ? [o dictionaryWithValuesForKeys:
             @[ NSMigratePersistentStoresAutomaticallyOption, @YES,  
                NSInferMappingModelAutomaticallyOption,       @YES]] 
          :  @{ NSMigratePersistentStoresAutomaticallyOption :@YES,
                NSInferMappingModelAutomaticallyOption       :@YES}
                                                      error:e];
    }