iOS 6 编程--Core Data持久化数据存储(2)-使用Core Data实现简单ShoppingCart应用程序
本节内容篇幅比较长!Core Data 属于 iOS App开发的进阶内容了。
下面先使用Core Data实现一个简单的范例ShoppingCart。本范例App不利用框架自动生成代码,完全自己编写所有的 Core data 相关代码,来深入理解 Core Data框架中主要类的使用。
使用Xcode的Single View Application模板,创建ShoppingCart项目,类前缀为Cart,如下图所示。
添加CoreData Framework框架
在ShoppingCart项目创建完成之后,我们需要添加CoreData Framework框架到项目中。详细操作步骤,可以参考-开发定位服务的App-教程中,添加Core Location框架的过程。
添加好CoreData Framework之后,将CoreData Framework 拖放到项目的Frameworks目录中,让项目文件看起来更加有序。
创建Data Model(数据模型)
下一步在项目中添加Data Model,选择左侧的Core Data栏位,右侧选择Data Model模板,如下图示:
输入名称 CartModel,并点击Create按钮。
项目导航栏中创建了CartModel.xcdatamodeld 文件。
下面,我们在项目中创建Group,命名为Resources,如下图所示。
我们将CartModel文件和Storyboard文件拖放到项目中的Resources 文件夹(或组)中。虽然这一操作不是必须的,但这样操作只是为了让项目文件管理有序。
另外,在项目中再创建一个新组,命名为Model Class,后面会用到。完成之后,项目导航栏如下图所示。
打开CartModel文件,如下图所示:
接着添加Entity(实体)和Attribute(属性),类似于数据表和数据字段。点击上述CartModel界面底部的Add Entity按钮,添加一个新的Entity,命名为Customer。
选择Customer实体,点击Attrubtes下面的+按钮,添加相应的Attribute字段。
逐步添加customerID (Integer 32)、customerName (String)、password (String)和userName (String)属性字段。
重复前面相同的步骤,创建ShoppingCartMaster和ShoppingCartDetail实体,并添加相应的Attribute字段,如下图所示。
这里基于App演示的需要,定义的Entity都比较简单。
下面建立这些Entity之间的关系(Relationship),点击CartModel底部的Editor Style,选择右侧的Graph样式。
显示3个实体及其属性,有点像数据库中的三张表。
[插图省略了]
建立Entity之间的关系有2种方法:(1) 选择ShoppingCartMaster,点击并按住下面的Add Attribute 图标,直到出现弹出菜单,选择Add Relationship选项。
选择新建立的关系,在右侧的Data Model inspector面板窗口,设置Relationship的相关属性,Name设置为 detail,Destination设置为 ShoppingCartDetail,另外选中 To-Many Relationship复选框,因为一个购物车中可能有多个商品。
同时Delete Rule 可以选择Cascade,实现级联删除,表示在使用Core Data删除ShoppingCartMaster中一个对象时,关联的ShoppingCartDetail也将删除。
此时,我们发现Xcode有一个警告信息,如下图所示。
[插图省略了]
ShoppingCart/CartModel.xcdatamodeld/CartModel.xcdatamodel/: warning: Consistency Error: ShoppingCartMaster.detail does not have an inverse; this is an advanced setting (no object can be in multiple destinations for a specific relationship)
意思是说刚刚创建的ShoppingCartMaster.detail关系没有反向关系。Apple建议每一个关系都创建一个反向关系。
好吧!我们在创建一个反向关系。
选择ShoppingCartDetail实体,和之前的操作一样,点击Add Relationship按钮,然后在右侧的Data Model inspector面板窗口,设置Relationship的相关属性,Name设置为 master,Destination设置为 ShoppingCartMaster,Inverse反向关系选择detail。之前创建的detail关系,其反向关系自动设置为master,可以检查一下看看。
[插图省略了]
(2) 另外一种建立Relationship的方法是,在该窗口中,选择实体Customer,按住Control键,并拖拉到shoppingCartMaster实体上。
同样,在Data Model inspector面板窗口中,设置Relationship的相关属性,如下图所示:
[插图省略了]
按照上面的拖拉操作建立Relationship会,一般会自动建立反向的关系,这个比较方便。将Customer实体到ShoppingCartMaster实体的关系命名为cart,将ShoppingCartMaster到Customer的关系命名为customer。
下面是已经建立好Entity关系之后的效果图。
下一步创建需要的NSManagedObjects 子类。
选择CartModel中的三个Entity,接着选择Xcode中的Editor 菜单下面的Generate NSManagedObjects Subclass … 子菜单项。
将生成的子类文件,可选择存放在ShoppingCart项目的Model Class文件夹中。在ShoppingCart项目导航栏中创建了6个文件,分别为Customer.h、Customer.m、ShoppingCartMaster.h、ShoppingCartMaster.m、ShoppingCartDetail.h和ShoppingCartDetail.m。
[插图省略了]
自动生成的这些文件可以让项目启用Core Data框架了,这些自动生成文件不要直接修改。这些自动生成的模型类,都继承NSManagedObject类-被管理对象,也就是数据库中数据表记录的对象表示。
下面是Customer.h文件的代码,可以简单看看。
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>@class ShoppingCartMaster;
@interface Customer : NSManagedObject
@property (nonatomic, retain) NSNumber * customerID;
@property (nonatomic, retain) NSString * customerName;
@property (nonatomic, retain) NSString * password;
@property (nonatomic, retain) NSString * userName;
@property (nonatomic, retain) ShoppingCartMaster *cart;@end
未完待续!!!
本教程的具体内容及其范例App都收录在《一步一步学习iOS 6 编程》的最新版PDF文件中。