2.11 创建托管对象
所有事情都准备好之后,现在就可以新建一些托管对象了。新对象是由NSEntity-Description按照指定的名称并根据某个特定的实体而创建出来的。除了要指定对象所依据的实体之外,还需提供指向托管对象上下文的指针,创建好的托管对象将会放在那个上下文里面。在application delegate中,可以通过[self cdh]或_coreDataHelper的context特性来获得这个上下文。
程序清单2-3演示了如何根据实体来新建托管对象,并将其插入上下文。要完成这项操作其实很简单,只需要调用NSEntityDescription类的insertNewObjectFor-EntityForName方法,并把适当的实体名称及指向上下文的指针传进去即可。
根据Item实体创建好托管对象之后,就可以直接用代码来操作它的值了。程序清单2-3底部的NSLog命令就说明了这一点:我们能够把newItem.name当作字符串变量传给NSLog。在操作对象的时候,通过“点”(.)来访问其特性是一种很清晰的写法,可以令代码更易读懂。
程序清单2-3 AppDelegate.m中的demo方法(用来演示如何向上下文中插入托管对象)
请按下列步骤修改Grocery Dude,以便向上下文中插入托管对象:
1.把#import“Item.h”语句添加到AppDelegate.m文件顶部。
2.修改AppDelegate.m中的demo方法,把程序清单2-3中的代码置于方法体的底部。
运行应用程序之后,就应该能在控制台中看到这些托管对象的名字了。Core Data已经成功运作起来了,你是不是该鼓励一下自己呢?程序运行效果如图2-6所示。
图2-6 向上下文中插入托管对象
提示 在给项目添加了某些属性之后,下次启动程序时可能会出现“The model used to open the store is incompatible with the one used to create the store.”(打开存储区时所用的模型与创建存储区时所用的不符)错误。假如真的碰到了这个错误,请你在模拟器或手机中删除该应用程序,然后重新运行项目,这样就能装好一份新的程序了。如果还是报错,那么可以点击Xcode的Product>Clean菜单项。到了第3章,我们会讲解一套优雅的模型升级方案,并把它实现出来。