managedObjectModel:initWithContentOfURL 中的错误

Posted

技术标签:

【中文标题】managedObjectModel:initWithContentOfURL 中的错误【英文标题】:managedObjectModel: Error in initWithContentOfURL 【发布时间】:2012-09-10 09:00:19 【问题描述】:

我试图重用一个使用数据核心的 xcodeproj。我将它导入到我的新项目中,当我尝试进行一些类初始化时,出现以下错误

'NSInvalidArgumentException',原因:'* -[NSURL initFileURLWithPath:]: nil string parameter' 设置 de managedObjectModel 时出错。

这是我的代码:

- (NSManagedObjectModel *)managedObjectModel 
    if (managedObjectModel == nil) 

        NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"momd"];
        NSURL    *modelURL  = nil;

        if (modelPath == nil)
            modelPath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"mom"];
        modelURL           = [NSURL fileURLWithPath:modelPath];
        managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    

    return managedObjectModel;

导致错误的行是

modelURL           = [NSURL fileURLWithPath:modelPath];

看起来我找不到 DataModel。我的数据模型文件名为 DataModel.xcdatamodel

有什么问题?我错过了什么重要的事情吗?

非常感谢。

【问题讨论】:

【参考方案1】:

您将nil 传递给fileURLWithPath

从你的代码来看,这意味着

   modelPath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"mom"];

nil 分配给modelPath,因此您可以查看数据模型文件的正确名称。

还要检查数据模型文件是否包含在您的目标中。

【讨论】:

我该如何检查呢?我的意思是,我的数据模型文件称为 DataModel.xcdatamodel。我还能做些什么来检查实际名称是什么? 是否已添加到您当前的目标中? 重命名 DataModel.xcdatamodeld 文件。关闭并重新打开 Xcode 客户端可能会解决此问题。【参考方案2】:

您的文件类型mom 应为momd

然后尝试像下面这样打印 modelPath 或 modelURL 并检查它是否为 nil.you 将 nil 传递给 modelURL = [NSURL fileURLWithPath:modelPath];

 NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"momd"];
        NSLog(@"%@",modelPath);

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DataModel" withExtension:@"momd"];
    NSLog(@"%@",modelURL);

【讨论】:

我得到 (null) 作为两行的输出。 重命名 DataModel.xcdatamodeld 文件。该问题可能通过关闭并重新打开 Xcode 客户端来解决。 它没有用。它就像 DataModel.xcdatamodeld 没有被编译或复制。但它包含在目标中 仅重命名模型文件是不够的,因为它不会将引用重命名为当前模型版本。事实证明,模型版本存储在一个单独的 plist 文件中。只需在文本编辑器中打开它并将旧名称更改为新模型文件名。文件:YourNEWModelFile.xcdatamodeld/.xccurrentversion _XCCurrentVersionNameYourModelFile.xcdatamodel列表>【参考方案3】:

好吧,我解决了。

我必须在我的 AppDelegate 所在的组中拥有我的 DataModel.xcdatamodel 的副本。所以我从另一个 xcodeproj 中添加了它,最后它工作了

【讨论】:

以上是关于managedObjectModel:initWithContentOfURL 中的错误的主要内容,如果未能解决你的问题,请参考以下文章

覆盖UIManagedDocument中的managedObjectModel

ManagedObjectModel 子类在 Swift 中不起作用

managedObjectModel 为零(仅在 WatchApp 中)

在 tableview 中显示图像时 managedObjectModel 错误指令

核心数据 NSEntityDescription.entityForName 返回 nil,但 managedObjectModel.entities 列出了实体

Apple CoreData 模板中的属性声明