如何正确更新Xcode4中的模型而不破坏它?

时间:2011-07-17 15:32:16

标签: core-data data-migration nspersistentdocument

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

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

  1. NSPersistentDocument,来自Apple的模板
  2. 覆盖Apple的模型加载方法,我唯一要做的就是在storeOptions字典中提供两个标志,这会打开自动迁移
  3. -(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
    {
    
        NSMutableDictionary *newOptions = nil;
    
        if( storeOptions != nil )
            newOptions = [NSMutableDictionary dictionaryWithDictionary:storeOptions];
        else
            newOptions = [NSMutableDictionary dictionary];
    
        [newOptions setValue:@"YES" forKey:NSMigratePersistentStoresAutomaticallyOption];
        [newOptions setValue:@"TRUE" forKey:NSInferMappingModelAutomaticallyOption];
    
        BOOL success = FALSE;
    
        success = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newOptions error:error];
    
        return success;
    }
    

    这是我一直在使用的过程(已经在Xcode4中解决了1个错误!)

    1. 选择模型(在Xcode4中命名为“something.xcdatamodel”,左侧有曲折)
    2. 转到“编辑器”菜单,选择“添加新模型版本...”
    3. 将新版本1的整数命名为高于最后一个 - 例如如果以前是“4”,则将新的名称命名为“5”
    4. 在右侧窗格中,将当前模型版本更改为新创建的版本
    5. XCode4错误的解决方法:选择任何文件,然后选择新创建的模型。如果不这样做,Xcode会在新创建的模型上显示选择,但会编辑以前的模型,这肯定会破坏CoreData中的所有内容。
    6. 编辑模型;在这种情况下,我正在向现有实体添加新属性
    7. 保存。建立。跑。 ...... CRASH。
    8. 除了,正如我所说,在3中大约2次这是正常的。一旦它工作一次,它(显然)很好 - 轻量级迁移完成,下一次保存保存在新模型版本中。

      所以我猜测在上面的步骤中我做错了什么,但我已经完成了5到6次的文档并且看不到任何明显的东西。没有帮助NSPersistentDocument文档都已过时 - 但我已经在iPhone上进行了很多次轻量级迁移,所以我有理由这样做,这对我来说似乎是正确的。


      我尝试/检查过的其他事情:   - iPhone Core Data Lightweight Migration Cocoa error 134130: Can't find model for source store(禁止;仅包含根xcdatamodel)

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

由于你已经淘汰了一个腐败的开发商店作为问题的根源,我怀疑问题出现在Xcode 4.x中,这至少可以说是错误的。很多人报告类似的问题,但没有两个问题看起来完全一样。这可能是一个只在特定数据模型设置中出现的错误,因此很难跟踪问题。

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

如果您有一个运送应用程序并且将在野外处理最终用户数据,那么您有道义和商业义务采取额外步骤来保护最终用户数据。

答案 2 :(得分:0)

我变得非常困惑但是这个,并且它没有工作..因为我假设该方法已经有一个“商店选项”字典..我只需要在我设置之前检查它的存在上述选择......

-(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];
}