核心数据:modelURL有效时模型为零

时间:2012-08-13 20:50:32

标签: objective-c ios core-data

__managedObjectModel即使是modelURL也是零。有a similar post,但是接受的答案(重命名模型文件并重新启动Xcode)对我不起作用。

- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil) {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Failed" withExtension:@"momd"];

    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    return __managedObjectModel;
}

我在控制台

中加注modelURL
(lldb) po modelURL
(NSURL *) $4 = 0x088832f0 file://localhost/Users/philip/Library/Application%20Support/iPhone%20Simulator/5.1/Applications/9E59167C-8D9E-4ADE-BBD7-0BE9A33A6A86/Failed.app/Failed.momd/

1 个答案:

答案 0 :(得分:8)

我在3个小时后解决了这个问题。最后。解决方案很简单:只需使用以下代码

__managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];

而不是

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Failed" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

原因是我曾经创建了新的模型文件(.xcodemodeld)并删除了旧的模型文件。这两个模型文件有不同的名称。实际上,旧模型文件根本不会被删除。它仍然在app主要包中。

我检查了iphone模拟器目录,并且令人惊讶地看到两个已编译的模型文件(.momd)都存在!我试图删除老妈妈。但每次我的应用程序运行时,老妈妈再次出现。我去检查目标构建阶段并确保旧模型文件不在编译源中。太奇怪了..

由于主捆绑包中存在多个已编译的模型文件,因此需要将它们合并。这就是mergedModelFromBundles:发挥作用而不是单modelURL的原因。

如果你从不删除任何模型文件,使用单个modelURL应该没问题。

虽然问题已解决,但我不明白为什么模拟器会将所有已删除的模型文件保存在主包中。这对我来说没有意义。有谁会解释?