【问题标题】:Using mergedModelFromBundles: and versioning (CoreData)使用 mergeModelFromBundles: 和版本控制 (CoreData)
【发布时间】:2011-01-17 22:25:43
【问题描述】:

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

你有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    做一个项目 -> Clean All 将解决这个问题。

    【讨论】:

    • 清洁不一定能解决问题。 Xcode 不会从已安装的应用程序中删除旧的资源文件,即使是在干净构建之后。使用 initWithContentsOfURL 而不是 mergeModelFromBundles 至少可以将问题减少到只有一个文件夹中的旧 .mom 文件。 (我几天来一直在解决这个问题:stackoverflow.com/a/13146888/1017650
    【解决方案2】:

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

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

    【讨论】:

    • 即使经过 6 年的付费 iOS 开发,我也不知道这个 xcode 错误。仍然存在于 Xcode 6 中。非常感谢!
    【解决方案3】:

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

    【讨论】:

    • 我得到Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'(文件网址正确)。此错误发生在:persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    • 没有需要切换到initWithContentsOfURL:。根据 Marcus 的回答,问题在于您的构建产品仍然包含旧模型。如果你简单地做一个 make clean,它就会被修复。使用 initWithContentsOfURL: 有效,因为您现在没有使用旧模型。
    • 实际上,由于 Xcode 不会删除旧资源文件,因此有必要(请参阅我对 @Marcus 回答的评论)。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      谢谢大家!

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

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

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

      再次感谢, --蝙蝠侠

      【讨论】:

        【解决方案6】:

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

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

        仅供参考!

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 2018-05-05
              • 1970-01-01
              • 1970-01-01
              • 2018-08-08
              • 2010-10-01
              • 2010-10-02
              • 2013-02-10
              • 1970-01-01
              • 2022-07-05
              相关资源
              最近更新 更多