NSManagedObjectModel initWithContentsOfURL 返回 nil 即使 modelURL 是有效的

Posted

技术标签:

【中文标题】NSManagedObjectModel initWithContentsOfURL 返回 nil 即使 modelURL 是有效的【英文标题】:NSManagedObjectModel initWithContentsOfURL returns nil eventhough the modelURL is valid 【发布时间】:2011-07-19 15:52:54 【问题描述】:

即使路径正确,我的 NSManagedObjectModel 返回 nil。

        NSString *modelKey = [NSString stringWithFormat:@"/%@/Model", name];
    NSString *modelPath = [((Configuration *)[Configuration shared]) stringEntry:modelKey];
    NSURL *modelURL = nil;
    if ( ! [modelPath contains:@"://"] ) 
        modelPath = PathForBundleResource( modelPath );
        modelURL = [NSURL fileURLWithPath:modelPath];
    
    NSManagedObjectModel *m = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

NSString *PathForBundleResource(NSString *relativePath)

    NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
return [resourcePath stringByAppendingPathComponent:relativePath];

我已经重置了模拟器,做了一个干净的构建,但没有任何帮助。

我是 iPhone 编程的新手(尤其是核心数据)。

不胜感激。

编辑:我已经编辑了有关 xcdatamodeld 文件的原始帖子。它最初没有正确连接,但现在它仍然存在同样的问题。

编辑 2:显然 xcdatamodel 的名称在链接后与 xcdatamodel 的名称有一些变化。它现在正在工作。感觉好傻。不知道如何删除这个问题。

【问题讨论】:

您可以为自己的问题添加答案,如果可以解决您的问题,请接受它,因为其他人可能有同样的问题。 【参考方案1】:

重命名 .xcdatamodeld 文件后,我遇到了同样的问题。问题已通过关闭并重新打开 Xcode 客户端解决。

【讨论】:

重命名 .xcdatamodeld 文件,这是一个奇怪的错误。感谢您的重启帮助。 该解决方案对我不起作用。我有完全相同的问题。还有其他人吗? 这里相同:重命名 + 构建 == 损坏(Apple 的代码)。重新启动 Xcode == 已修复。是的 ***!我会浪费时间找不到那个:( 天哪,我在这上面浪费了 2 个小时。为什么哦为什么:(谢谢你的提示!!会浪费更多时间。 5 年后,它仍然是 Xcode 7.2 中的一个错误。天哪!【参考方案2】:

我刚刚在不区分大小写的文件系统上更改 .xcdatamodeld 文件名称的大小写(例如,将“mydatastore.xcdatamodeld”重构为“MyDatastore.xcdatamodeld”)后遇到了这个问题。

修复包括上述两个答案:

    将数据模型文件重构为明显不同的名称,例如"MyDatastoreTemporary.xcdatamodeld"

    产品 > 清洁

    关闭 XCode。重新打开 XCode 和项目。

    将数据模型文件重构回其最终名称,例如"MyDatastore.xcdatamodeld"

    产品 > 清洁

    关闭 XCode。重新打开 XCode 和项目。

【讨论】:

当 Xcode 在模型名称中插入下划线,而产品名称在该位置包含空格时,我遇到了这个问题。我尝试重命名并最终来到这里..【参考方案3】:

我尝试了上述两个答案,但是为我解决的问题是从 Xcode 项目中删除和重新添加 .xcdatamodeld 文件。不需要清洁。出于某种原因,将其重新添加似乎可以解决问题。

【讨论】:

【参考方案4】:

我解决了问题,将模型 .xcdatamodeld 移到垃圾箱,然后再添加一次。

【讨论】:

你能否详细解释一下你是如何删除并再次添加 .xcdatamodeld 的,对我来说 .xcdatamodeld 没有显示删除并再次添加。 这也对我有用。问题出在 .xcurentversion 中,它是旧名称。【参考方案5】:

如果您尚未对模型进行版本控制,目前最安全的方法是执行以下操作。

    不要重命名您的 xcdatamodeld 文件。 改为使用新名称创建一个全新的数据模型文件。 保持文件为空并退出 Xcode 打开终端并 cd(更改目录)进入旧的 xcdatamodeld 目录。 在这个目录中应该有一个以 xcdatamodel 结尾的目录。切换到这个目录。 在 xcdatamodel 目录中,您将找到一个名为 contents 的文件。将此文件复制到新命名的 ?.xcdatamodeld/?.xcdatamodel 目录下的同一位置。 打开 Xcode 并修改您的 Core Data 代码以访问这个新模型。 构建和测试。 从您的项目中删除旧的 xcdatamodeld。

这适用于没有版本的基本模型。

【讨论】:

【参考方案6】:

当我第一次运行项目时,我将扩展名指定为 xcdatamodeld。但这失败了,因为它应该是 momd。但是我通过了 nil 而不是 momd 假设扩展不是强制性的。但是使用 nil,initWithContentsOfURL 失败了,当我最终输入 momd 时,它工作正常。

【讨论】:

以上是关于NSManagedObjectModel initWithContentsOfURL 返回 nil 即使 modelURL 是有效的的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject、NSManagedObjectContext 和 NSManagedObjectModel 的区别

NSManagedObjectModel 合并模型FromBundles 错误

尝试使用前向类“NSManagedObjectModel”作为 Swift 类模型的超类

NSInternalConsistencyException 原因 +entityForName:找不到实体名称的 NSManagedObjectModel

+entityForName: 找不到实体名称的 NSManagedObjectModel

NSManagedObjectModel initWithContentsOfURL 返回 nil 即使 modelURL 是有效的