测试基本的核心数据先决条件?
Posted
技术标签:
【中文标题】测试基本的核心数据先决条件?【英文标题】:Testing basic Core Data prerequisities? 【发布时间】:2012-02-13 19:42:49 【问题描述】:我正在努力处理核心数据。我收到臭名昭著的错误“无法在 NSManagedObject 类上调用指定的初始化程序”。对于阅读文档的新手,从 Xcode 4.2 中的标准模板开始,此错误的存在/发生没有任何意义。 托管对象的初始化怎么可能失败? 我没有以任何方式从模型修改自定义生成的类。这意味着,我没有覆盖那些 NSManagedObject 子类的默认初始化程序 (initWithEntity:insertIntoManagedObjectContext:)。为什么调用不成功?
我的整个设置非常基础。 我有一个上下文、一个商店协调员和一个模型。这是由模板设置的。 我直观地编辑了数据模型,那里有四个实体。然后我生成了四个具有动态属性的类。 现在我唯一要做的就是将从 AppDelegate 对上下文的引用传递给我的自定义 ViewController。在这个自定义 ViewController 中,我尝试将一个新实体添加到 Core Data 上下文中。
是否有一些方法或一组步骤可以用来测试整个核心数据堆栈是否已正确初始化? store是否存在,context是否ok?
NSManagedObjectModel *managedObjectModel = [[managedContext persistentStoreCoordinator] managedObjectModel];
NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"ComplexLocation"];
currentComplexLocation = [[ComplexLocation alloc] initWithEntity:entity insertIntoManagedObjectContext:managedContext];
【问题讨论】:
你能发布触发错误的代码,以及你生成的核心数据类吗? 我在尝试添加实体的地方添加了代码。 更容易使用便捷函数[NSEntityDescription insertNewObjectForEntityForName:@"ComplexLocation" inManagedObjectContext: managedContext];
话虽如此,在 initWithEntity 中使用之前,您是否检查以确保在 managedObjectModel 和 entity 中返回了正确的值?
我该如何检查 -> “在 initWithEntity 中使用之前,您是否检查以确保在 managedObjectModel 和实体中返回了正确的值?”
【参考方案1】:
也就是说,我没有覆盖那个默认初始化器 (initWithEntity:insertIntoManagedObjectContext:) 那些 NSManagedObject 子类。为什么调用不成功?
错误抱怨的问题是您没有调用指定的初始化程序。如果你继承了 NSManagedObject 的子类,你需要确保任何初始化程序都调用该方法。如果您要实例化 NSManagedObject 本身,则需要通过调用该方法来完成。
通常,将对象添加到上下文的简单方法是调用+[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]
。
在这个自定义 ViewController 中,我尝试将一个新实体添加到 Core Data 上下文中。
我认为您的意思是一个新的托管对象。在运行时添加实体是不寻常的。在任何情况下,您都应该在执行该操作的位置显示代码。
【讨论】:
是的,我尝试添加一个托管对象,当然……我的词汇还不够精确。现在对于初始化器,从模型生成的所有自定义类都没有实现任何显式初始化器,这意味着作为 NSmanagedObject 的子类的自定义类 ComplexLocation 从其父类继承了指定的初始化器,即 nsManagedObject。当我尝试将托管对象添加到上下文中时,我明确地调用了这个指定的初始化程序。还是我错过了什么? :-/以上是关于测试基本的核心数据先决条件?的主要内容,如果未能解决你的问题,请参考以下文章