我遇到了一个似乎涉及迁移的错误,但我没有使用任何迁移。这里仍然是基本的核心数据。
我有一个现有的应用程序,我正在尝试添加Core Data。我已将相关代码放入App Delegate中。该应用程序是一个基本的选项卡应用程序。
如何在委托之外的其他控制器中访问Core Data?谷歌搜索后,我认为这样做的方式是:
app = (RootAppDelegate*)[UIApplication sharedApplication].delegate;
FirstViewController.managedObjectContext = app.managedObjectContext;
当我这样做时,我得到:
* 由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因: '无法合并两种不同的模型 名为'Event'的实体
我在这里做错了什么?
答案 0 :(得分:1)
您可能在项目中有两个或更多.xdatamodel文件,每个文件都有Entity
属性。这是由Xcode模板项目生成的实体,因此您可能复制了一个模板数据模型文件。
您在控制器中收到错误,因为模板应用程序委托在访问managedObjectContext属性之前不会初始化Core Data堆栈。访问managedObjectContext属性会触发加载managedObjectModel属性。模板使用mergedModelFromBundles:
创建模型,该模型扫描应用程序包中的所有模型文件,并尝试从中构建单个模型。
如果您有两个或更多具有相同名称的实体的模型,则会收到您看到的错误。此上下文中的merge
与迁移无关,而是合并同一版本中使用的多个模型文件。
答案 1 :(得分:0)
您是否更改了模型(在开发过程中)并且应用程序是使用之前的模型安装在设备/ SIM上的?
如果是这样,只需删除该应用并重新运行,它应该可以正常工作。
答案 2 :(得分:0)
如何在委托之外的其他控制器中访问Core Data?
访问NSManagedObjectContext的首选方法是通过NSManagedObject实例。例如:
[anEntity managedObjectContext];
您还可以将NSManagedObjectContext的引用传递给需要它的视图控制器。
如果您在设置持久性存储协调器时启用了自动迁移,那么您需要在managedObjectModel访问器中执行一些额外步骤的帖子suggests:
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"Event" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
return managedObjectModel;
}
这是一个较旧的解决方案(不确定它仍然可以做到这一点)。