深刻浅出 Cocoa 之 Core Data(3)- 使用绑定app
罗朝辉(http://blog.csdn.net/kesalin)框架
CC 许可,转载请注明出处oop
前面讲解了 Core Data 的框架,并彻底手动编写代码演示了 Core Data 的运做过程。下面咱们来演示如何结合 XCode 强大的可视化编辑以及 Cocoa 键值编码,绑定机制来使用 Core Data。有了上面提到的哪些利器,在这个示例中,咱们无需编写 NSManagedObjectModel 代码,也无需编写 NSManagedObjectContext,工程模版在背后为咱们作了这些事情。
今天要完成的这个示例,有两个 Entity:StudentEntity 与 ClassEntity,各自有一个名为 name 的 Attribute。其中 StudentEntity 经过一个名为 inClass 的 relationship 与 ClassEntity关联,而 ClassEntity 也有一个名为 students 的 relationship 与 StudentEntity 关联,这是一个一对多的关系。此外 ClassEntity 还有一个名为 monitor 的 relationship 关联到 StudentEntity,表示该班的班长。编码
代码下载:点此下载
最终的效果图以下:atom
下面咱们一步一步来完成这个示例:
1,建立工程:
建立一个 Cocoa Application,工程名为:MacCoreData,并勾选 Create Document-Based Application 和 Use Core Data,在这里要用到 Core Data 和 Document 工程模版,以简化代码的编写。spa
2,分类文件:
在 MacCoreData 下新建 Src 和 Res 两个 Group,并将 MyDocument.h 和 MyDocument 拖到 Src 下,将其余 xib 和 xcdatamodeld 拖到 Res 中。将文件分类是个好习惯,尤为是对大项目来讲。后面请自觉将文件分类~~.net
3,建立 Entity:
在工程中,咱们能够看到名为 MyDocument.xcdatamodeld 的文件,其后缀代表这是一个 core data model文件,框架就是读取该模型文件生成模型的。下面咱们选中这个文件,向其中添加两个实体。点击下方的 Add Entity 增长两个新 Entity: ClassEntity 和 StudentEntity。指针
向 StudentEntity 中添加名为 name 的 string 类型的 Attribute,并设置其 Default Value 为学生甲,去除 Optional 前勾选状态;
向 ClassEntity 中添加名为 name 的 string 类型的 Attribute,并设置其 Default Value 为XX班,去除 Optional 前勾选状态;
选项 Optional 是表示该 Attribute 可选与否的,在这里 name 都是必须的。对象
向 StudentEntity 中添加名为 inClass 指向 ClassEntity 的 Relationship,其 Inverse 栏要等 ClassEntity 添加了反向关系才能选择,后面回提到;
向 ClassEntity 中添加名为 students 指向 StudentEntity 的 Relationship,其 Inverse 栏选择 inClass,代表这是一个双向关系,勾选 To-Many Relationship,由于一个班级能够有多名学生,这是一对多关系。设定以后,咱们能够能够将 StudentEntity 的 inClass 关系的 Inverse 设置为 students了。
再向 ClassEntity 中添加名为 monitor 指向 StudentEntity 的 Relationship,表示该班的班长。blog
4,生成 NSManagedObject 类:
选中 StudentEntity,而后点击菜单 File-> New -> New file…,添加 Core Data -> NSManagerObject subclass, XCode 就会自动为咱们生成 StudentEntity.h 和 StudentEntity.m 文件,记得将这两个文件拖放到 Src Group 下。下面咱们来看看这两个文件中有什么内容:
StudentEntity.h
StudentEntity.m
在前面手动代码的示例中,咱们是本身编写 Run NSManagedObject的代码,而如今,XCode 已经根据模型文件的描述,自动为咱们生成了,方便吧。有时候自动生成的代码不必定知足咱们的须要,咱们就得对代码进行修改,好比对 ClassEntity 来讲,班长只能是其 students 中的一员,若是咱们在 students 中移除了班长那个学生,那么该班级的班长就应该置空。
选中 ClassEntity,重复上面的步骤,自动生成 ClassEntity.h 和 ClassEntity.m,下面咱们根据需求来修改 ClassEntity.m。
在 - (void)removeStudentsObject:(StudentEntity *)value 的开头添加以下代码:
在 - (void)removeStudents:(NSSet *)value 的开头添加以下代码:
这样当咱们在 students 中删除一个学生时,就会检测该学生是否是班长,若是是,就将该班的班长置空。
5,下面来生成 UI 界面:
在这里,咱们是经过切换 view 的方法来显现学生与班级两个界面,所以咱们须要主界面,班级以及学生共三个界面。
向 MyDocument.xib 中添加以下一个 popup button 和一个 NSBox。并删除 popup 控件中的 menu item,由于咱们要经过代码来添加班级,学生项的。
而后在 Res 中添加两个新 Empty xib 文件:StudentView.xib 和 ClassView.xib,分别向这两个 xib 文件中拖入一个 Custom View,而后在这个 view 添加相关控件构成 UI。记得设置 ClassView 中两个 tableView 的列数为 1,拖入一个 PopupButtonCell 到 StudentView 中班级那一列。效果以下:
6,添加 ViewController:
下面咱们建立 ViewController 来在程序中转载 xib 文件,显示和切换 view。为了便于切换 view,咱们建立一个继承自 NSViewController 的名为:ManagedViewController的类(记得不要建立该类对应的 xib 文件!建立一个 NSObject子类,而后修改其父类为 NSViewController),而后让 StudentViewController 和 ClassViewController 从它继承。ManagedViewController 类的代码以下:
ManagedViewController.h
ManagedViewController.m
在上面代码中,咱们有一个 NSManagedObjectContext * managedObjectContext 指针,它指向 MyDocument 框架中的NSManagedObjectContext对象,后面咱们会说到,至于 NSArrayController * contentArrayController,它是一个 IBOutlet,将与xib 中建立的 NSArrayController关联,后面也会说到。在这里引入 contentArrayController 是为了让 delete 可以删除记录。
ClassViewController 类的代码以下:
StudentViewController 类的代码以下:
在这两个子类中,咱们在 init 方法中载入 xib 文件,而后设置其 title。