11

我正在尝试使用 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 建议的方法,通过使用菜单选项“添加模型版本”。

你有什么主意吗?

4

8 回答 8

28

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

做一个项目 -> 全部清理将解决这个问题。

于 2010-02-17T17:16:09.930 回答
9

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

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

于 2010-03-24T23:49:53.923 回答
4

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

于 2010-02-17T15:57:57.747 回答
2

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

于 2011-01-28T02:22:08.030 回答
0

谢谢大家!

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

有关更多信息,请参阅其他 Stack Overflow 主题: 使用合并模型FromBundles:和版本控制 (CoreData)

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

再次感谢,--Batgar

于 2010-02-28T14:50:26.117 回答
0

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

所以重置一些现有模型的当前版本名称(然后你会看到绿色复选标记发生变化),重建并且它工作。

供参考!

于 2011-05-15T11:39:50.423 回答
0

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

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

于 2012-03-20T11:07:33.790 回答
0

我也开始崩溃[[NSManagedObjectModel mergedModelFromBundles:nil],没有错误消息(典型的核心数据)。我最终解决了这个问题,意识到我用相同的名称命名了不同模型中的两个实体。这就是为什么它对我来说崩溃了。更改名称阻止了它崩溃。

于 2015-09-11T10:15:34.993 回答