从设备删除应用后,无法使用nil模型创建NSPersistentStoreCoordinator

时间:2012-09-27 08:55:40

标签: iphone ios xcode core-data

从设备删除我的应用程序后,我收到'Cannot create an NSPersistentStoreCoordinator with a nil model'错误。我在iPad设备上测试iPhone应用程序。我已经把这段代码用来检查AppDelegate.m中是否有文件:

- (NSManagedObjectModel *)managedObjectModel {
    if (__managedObjectModel != nil) {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Name" withExtension:@"momd"];
    if ([[NSFileManager defaultManager] fileExistsAtPath:[modelURL path]]) {
        NSLog(@"%@", [modelURL path]); //This is printed because file exists
    }
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return __managedObjectModel;
}

问题是[NSManagedObjectModel initWithContentsOfURL]返回零值。 我做了以下事情,没有成功:

  1. 使用此__managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
  2. 更改managedObjectModel实例化
  3. 清理构建文件夹和清理项目
  4. 重新启动Xcode
  5. 重新启动的计算机
  6. 将“妈妈”改为“妈妈”
  7. .xcdatamodeld位于Copy Bundle Resources and Compile Sources
  8. 重命名.xcdatamodeld并多次清理和关闭Xcode项目
  9. 关闭并打开设备
  10. 已删除文件夹:$ cd /Users/john/Library/Developer/Xcode/DerivedData
  11. 更改了强制数据库生成的sqlite名称
  12. 从devine
  13. 删除(再次)申请

    我一直在寻找解决方案几个小时,我仍然找不到它。

4 个答案:

答案 0 :(得分:15)

最后,在两天试图解决这个问题后,我在这里找到了解决方案:

How to create the magic .xcdatamodeld folder / package?

我现在正在完成一个其他开发人员启动的项目,似乎他没有将最新的更改推送到repo,但这些更改都在设备的应用程序中,当我删除了我删除的应用程序时正确的.xcdatamodeld文件。问题是我在项目中只有一个MyApp.xcdatamodel文件,而这似乎是momd空文件夹的原因。

为了创建正确的数据模型层次结构,解决方案非常简单:

  1. 选择MyApp.xcdatamodel
  2. 转到编辑器>添加模型版本......
  3. 这会将MyApp.xcdatamodel文件嵌入MyApp.xcdatamodeld。现在momd文件夹中有mom个文件,应用程序运行正常。现在唯一的问题是我有两个MyApp.xcdatamodel,一个带有绿色选中图标,但两者都有相同的内容,所以没问题。

答案 1 :(得分:2)

我支持再次构建我的第一个iOS应用程序。今天,我收到了这个错误:“无法使用nil模型创建NSPersistentStoreCoordinator”。 实际上,这很容易解决。 请制作以下代码:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[name]" withExtension:@"momd"];

您填写的[name]与您的模型文件(.xcdatamodeld)相同。 例如,我有一个TipRecord.xcdatamodeld,那么这一行应该是:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TipRecord" withExtension:@"momd"];

答案 2 :(得分:1)

 NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"select xcdatamodeld" withExtension:@"momd"];

为资源名称选择确切的网址。

答案 3 :(得分:0)

它相对简单。

如果你有一个xcdatamodel文件没有版本:使用扩展名" mom"在您的managedObjectModel声明中。 如果你的xcdatamodel有版本,你应该使用" momd"。