- NSManagedObjectModel上的[NSURL initFileURLWithPath:]:nil string parameter'

Sle*_*lee 9 iphone core-data ipad

只是试图进入核心数据的东西,并立即开始越过.在我的AppDelegate中,我有以下代码:

- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel_ != nil) {
        return managedObjectModel_;
    }
    NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"momd"];
    NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
    managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
    return managedObjectModel_;
}
Run Code Online (Sandbox Code Playgroud)

其中@"DataModel"是我的.xcdatamodel文件的名称 - 这是正确的吗?

Joh*_*one 12

将"妈妈"改为"妈妈"对我有用.一旦我修改了语法,Marcus S. Zarra的答案也对我有用:

managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
Run Code Online (Sandbox Code Playgroud)

虽然我不知道那条线是做什么的.

编辑:我做了一些更多的研究,现在我知道上面的内容是什么以及它为何起作用/不起作用.上面的行将在您的项目中搜索所有模型,并将它们添加到xcdatamodel.如果您不使用版本化模型,则此方法有效.但是,如果您将来切换到使用版本化模型,则会导入所有版本的模型,这样您就可以同时获得旧的和新的模型,这不是您想要的.所以解决方案是做两件事之一.如果要使用非版本化模型,请使用以下行来获取模型:

NSString *modelPath = [[NSBundle mainBundle]
    pathForResource:@"DataModel" ofType:@"mom"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
Run Code Online (Sandbox Code Playgroud)

如果要使用版本化模型(推荐),请选择模型并从菜单栏运行设计 - >数据模型 - >添加模型版本以创建版本化模型.这将自动将模型的扩展名从xcdatamodel更改为xcdatamodeld.完成此操作后,请使用以下行:

NSString *modelPath = [[NSBundle mainBundle]
    pathForResource:@"DataModel" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
Run Code Online (Sandbox Code Playgroud)

请注意,唯一的区别是ofType参数从@"mom"变为@"momd".我希望这能澄清每个试图了解CoreData.D的人的情况


Mar*_*rra 9

通常更容易将其更改为

managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
Run Code Online (Sandbox Code Playgroud)

然后,如果它是妈妈或妈妈,你仍然会得到模型.