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文件中。

 





转载于:https://www.cnblogs.com/tuncaysanli/archive/2012/10/17/2727900.html

以下是一个简单的Java程序,使用Session技术实现购物车功能。该程序使用了一个名为ShoppingCart的JavaBean来表示购物车,使用了Session来存储购物车的状态。 ShoppingCart.java ```java import java.util.ArrayList; import java.util.List; public class ShoppingCart { private List<String> items; public ShoppingCart() { items = new ArrayList<String>(); } public void addItem(String item) { items.add(item); } public void removeItem(String item) { items.remove(item); } public List<String> getItems() { return items; } public int getItemCount() { return items.size(); } public void clear() { items.clear(); } } ``` ShoppingCartServlet.java ```java import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class ShoppingCartServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取Session对象 HttpSession session = request.getSession(); // 获取购物车对象 ShoppingCart cart = (ShoppingCart) session.getAttribute("cart"); if (cart == null) { // 如果Session中没有购物车对象,创建一个新的购物车对象并存储到Session中 cart = new ShoppingCart(); session.setAttribute("cart", cart); } // 获取操作类型 String action = request.getParameter("action"); if (action == null) { // 显示购物车内容 response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>"); List<String> items = cart.getItems(); if (items.isEmpty()) { out.println("<p>Your shopping cart is empty</p>"); } else { out.println("<p>You have the following items in your shopping cart:</p>"); out.println("<ul>"); for (String item : items) { out.println("<li>" + item + "</li>"); } out.println("</ul>"); } out.println("<a href=\"?action=clear\">Clear cart</a>"); out.println("</body></html>"); } else if (action.equals("add")) { // 添加物品到购物车中 String item = request.getParameter("item"); cart.addItem(item); response.sendRedirect(request.getContextPath() + "/cart"); } else if (action.equals("remove")) { // 从购物车中删除物品 String item = request.getParameter("item"); cart.removeItem(item); response.sendRedirect(request.getContextPath() + "/cart"); } else if (action.equals("clear")) { // 清空购物车 cart.clear(); response.sendRedirect(request.getContextPath() + "/cart"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ``` 在ShoppingCartServlet中,我们首先获取Session对象,并从Session中获取购物车对象。如果Session中没有购物车对象,我们就创建一个新的购物车对象并存储到Session中。 然后,我们根据操作类型执行相应的操作。如果操作类型为null,我们就显示购物车中的内容。如果操作类型为add,我们就将物品添加到购物车中。如果操作类型为remove,我们就从购物车中删除物品。如果操作类型为clear,我们就清空购物车。 需要注意的是,在Servlet中我们使用了重定向来避免表单重复提交的问题。当我们添加、删除或清空购物车时,我们会重定向到/cart页面来避免表单重复提交的问题。 在JSP页面中,我们可以使用表单来向Servlet发送请求来操作购物车。例如,我们可以使用以下代码来添加一个物品到购物车中: ```html <form action="<%=request.getContextPath()%>/cart?action=add" method="post"> <input type="text" name="item"> <input type="submit" value="Add to cart"> </form> ``` 当我们提交表单时,Servlet会将物品添加到购物车中,并重定向到/cart页面,显示购物车中的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值