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 是有效的