使用mergedModelFromBundles:和版本控制(CoreData)

时间:2010-02-17 15:50:05

标签: iphone core-data core-data-migration

我正在尝试使用CoreData中的迁移功能。我已经关注了Apple文档。我在以下方法中遇到问题:

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created by merging all of the models found in the application bundle.
 */
- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    /* 
     * NSInvalidArgumentException', reason: '*** -[NSCFArray insertObject:atIndex:]: attempt to insert nil'
     * 2010-02-17 16:27:15.338 Patrimoine[3037:207]
     */ 
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}

http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html

似乎存在同样的问题

然而,我确实选择了Apple建议的方法,使用菜单选项“添加模型版本”。

你有什么想法吗?

8 个答案:

答案 0 :(得分:28)

您需要清理项目。一旦你“版本”你的模型Xcode将其移动到一个包(文件夹)但它不会删除旧的。然后会发生的是,下次运行您的应用程序时,您的模型中有两个副本;旧的和新的一个在妈妈的束里面。

做项目 - >全部清除将解决此问题。

答案 1 :(得分:9)

此外,如果您在任何时候重命名模型,请确保重复“设置当前模型”步骤,切换到较旧版本,然后再次返回到较新模型。我的构建设置不会自动重置并保持将“当前模型名称”设置为不存在的模型,从而导致完全相同的问题。

您始终可以在构建产品的资源文件夹中,在导入的.momd目录中,在名为versioninfo.plist的文件中验证此设置是否正确 - 当前模型的设置必须与模型的实际名称匹配。

答案 2 :(得分:4)

我发现使用mergedModelFromBundel:方法似乎不适用于迁移;我切换到-initWithContentsOfURL:,它工作正常。请注意,您必须使用指向“.momd”文件的URL来初始化它。

答案 3 :(得分:2)

如果您在任何时候更改数据模型,请务必在模拟器中重置内容和设置,否则您将收到用于存储的模型版本与用于存储的模型不同的错误访问它。

答案 4 :(得分:0)

感谢大家!

这些都有效,但只有在我使用了Clean build选项后才能使用。

有关详细信息,请参阅此其他Stack Overflow主题: Using mergedModelFromBundles: and versioning (CoreData)

iPhone核心数据参考有一个相当不错的写作。文档中的正式流程是“自动轻量级迁移”。

再次感谢, --Batgar

答案 5 :(得分:0)

起初,上述方法都不适合我。 我正在使用XCode 4。 执行Clean,Clean Build Folder,找到.app文件,检查除了正确的文件(包含旧版本和新版本)之外没有其他.xcdatamodel文件。 试图使用initWithContentsOfURL: 验证当前版本对应于正确的版本并在模拟器上执行重置内容和设置。 然后编辑了VersionInfo.plist并发现NSManagedObjectModel_CurrentVersionName值对应于不存在的版本名称!

因此,重置某个现有模型的当前版本名称(然后看到绿色复选标记更改),重建并运行。

FYI!

答案 6 :(得分:0)

对我来说不幸的是,这不是清洁或版本控制的问题。我有一个有点复杂的项目,有几层嵌套的Xcode项目。为了处理每个项目在不同SVN存储库中的问题,我将项目的路径设置为相对于我在Xcode“Preferences - > Locations”中设置的某些特定源树。例如,我设置FACEBOOK_IOS_SDK_SRC指向“〜/ Documents / {my_crazy_folder_structure} / facebook-ios-sdk / src”。这样,每当我的同事检查我的项目时,Facebook SDK的位置都与他们设置的路径相关,并且不必与他们的机器上的结构完全相同。我知道有更好的方法可以解决这个问题,但它现在正在发挥作用。

无论如何 - 我的问题出现了,因为在某些时候我的* .xcdatamodel文件位置为“相对于{source_tree_path}”,它发现文件很好,甚至将其编译成* .mom文件但我是在最初的问题中列出了这个疯狂的错误。我将我的位置更改为“相对于组”并开始工作。我还没有找到确切的原因,但它浪费了一天调查的大部分时间。希望这将有助于将来的其他人。

答案 7 :(得分:0)

我也开始遇到[[NSManagedObjectModel mergedModelFromBundles:nil]的崩溃,没有错误消息(典型的核心数据)。我最终通过意识到我在同一名称的不同模型中命名了两个实体来解决它。这就是为什么它会让我崩溃的原因。更改名称会使其崩溃。