#import <UIKit/UIKit.h>

#import <CoreData/CoreData.h>

@interface CHViewController : UIViewController

@property (retain, nonatomic) IBOutletUITextField *nameTextFiled;

@property (retain, nonatomic) IBOutletUITextField *ageTextField;

@property (retain, nonatomic) IBOutletUITextField *idNUmberTextField;

@property (retain, nonatomic) IBOutletUITextField *selTextfield;

@property (retain ,nonatomic) NSString *pername;

- (IBAction)saveButtonClick:(id)sender;

- (IBAction)readButtonClick:(id)sender;

- (IBAction)touchView:(id)sender;

- (IBAction)deletButtonClick:(id)sender;

@end

#import "CHViewController.h"

@interfaceCHViewController ()

{

NSManagedObjectContext *context;

NSManagedObject *selectedObject;

}

@end

/*IOS 开发中经常会用CoreData,我目前的理解,CoreData相当于一个综合的数据库管理库,它支持sqlite,二进制存储文件两种形式的数据存储。而CoreData提供了存储管理,包括查询、插入、

删除、更新、回滚、会话管理、锁管理等一系列数据库操作。另外,开发者还可以在xcode中使用 .xcdatamodel 扩展名的文件,以图形化的形式编辑数据模型,这里包括了

Entities、Properties、Attributes、Relationships四个概念,这里跟关系型数据库有很大的相似点。

首先理解几个概念:

Model,Entity,Attribute,Relationship。

可以简单的用关系数据库的概念来解释:model为database(数据库),Entity对应一张表,Attribute为表中的字段(相当于类的属性),relationship为关系。

了解CoreData里面几个重要对象:

NSManagedObject:通过CoreData取回的对象默认都是NSManagedObject,所以使用Core Data的Entity类都是继承自NSManagedObject。(可以在Model中新建Entity后由在xcode中新建NSManagedObject subclass由xcode自动生成对应子类)

  NSManagedObjectContext:负责应用和数据库之间的工作

  NSPersistantStoreCoordinator:可以指定文件并打开相应的SQLLite数据库。

  NSFetchRequest:用来获取数据

  NSEntityDesciption:代表Entity 对应的类

使用CoreData的具体步骤:

1,在项目中新建一个模型文件(Data Model),新建后项目里面会有一个*.xcdatamodeld文件生成。

新建方法:

在工程文件夹上右键->New File...->Core Data选项中的 Data Model

2,根据需求在模型中添加Entity,也就是我们理解的表。同时为Entity定义相应的Attribute。

添加Entity:选中*.xcdatamodeld点击Add Eneity,创建好之后可以添加字段(属性),可以更改字段的名字和数据类型

3,确立Entity之间的关系,支持一对一和一对多关系

4,为每个Entity添加对应的NSManagedObject子类,实现数据存取操作

前3步都可以在可视化界面下完成,第4需要自己写代码去实现。*/

@implementation CHViewController

- (void)viewDidLoad

{

[superviewDidLoad];

//创建数据模型对象从应用程序包中加载模型文件

NSManagedObjectModel *model = [NSManagedObjectModelmergedModelFromBundles:nil];

//创建持久化存储助理  可以指定文件并打开相应的SQLLite数据库

NSPersistentStoreCoordinator *store = [[[NSPersistentStoreCoordinatoralloc] initWithManagedObjectModel:model] autorelease];

//构建SQLite数据库文件的路径 并创建

//1、documents路径

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

//2、要创建的文件地址

NSURL *url = [NSURLfileURLWithPath:[documentsPath stringByAppendingPathComponent:@"person.coredata"]];

//添加持久化存储库,这是使用SQLite作为存储库

NSError *error;

//创建存储对象

//NSPersistentStore-持久化存储,将模型对象中的数据存入SQLite文件中

NSPersistentStore *sistentStore = [store addPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:url options:nilerror:&error];

//判断,如果:持久化存储失败

if (sistentStore == nil) {

//异常处理,用来捕获异常

[NSExceptionraise:@"添加数据库错误" format:@"%@",[errorlocalizedDescription]];

}

//初始化上下文  相当于数据库的连接器

context = [[NSManagedObjectContextalloc]init];

//设置persistentStoreCoordinator属性

context.persistentStoreCoordinator = store;

}

- (void)didReceiveMemoryWarning

{

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

- (IBAction)saveButtonClick:(id)sender

{

//NSString *sqlPath = [self getFilePath:@"test.Core Data"];

//传入上下文,创建一个Person实体对象

NSManagedObject *person = [NSEntityDescriptioninsertNewObjectForEntityForName:@"Person"inManagedObjectContext:context];

//设置person的简单属性

//1.姓名

[person setValue:self.nameTextFiled.text forKey:@"name"];

//年龄

[person setValue:self.ageTextField.text forKey:@"age"];

//传入上下文,创建一个Card实体对象

NSManagedObject *card = [NSEntityDescriptioninsertNewObjectForEntityForName:@"IDCard"inManagedObjectContext:context];

//设置card简单属性

//1.身份证号

[card setValue:self.idNUmberTextField.text forKey:@"no"];

//设置Person和Card之间的关联关系

[person setValue:card forKey:@"card"];

//利用上下文,将数据同步到持久化存储库person.coredata

NSError *error = nil;

//如果是想做更新操作:只要在更改了实体对象的属性后调用[context save:&error],就能将更改的数据同步到数据库

BOOL success = [context save:&error];

//判断:如果没有存储成功

if (!success) {

//异常处理,用来捕获异常

[NSException raise:@"访问数据库错误" format:@"%@", [error localizedDescription]];

}

//pername用来记录刚存入的姓名,供查询

//self.pername = self.nameTextFiled.text;

//存入成功后输入框置空

self.nameTextFiled.text = @"";

self.ageTextField.text = @"";

self.idNUmberTextField.text = @"";

}

- (IBAction)readButtonClick:(id)sender

{

// NSString *sqlPath = [self getFilePath:@"test.Core Data"];

//初始化一个查询请求用来获取数据

NSFetchRequest *request = [[[NSFetchRequestalloc] init]autorelease];

//设置要查询的实体  代表Entity 对应的类

NSEntityDescription *description = [NSEntityDescriptionentityForName:@"Person"inManagedObjectContext:context];

request.entity = description;

//设置排序(按照age降序)

NSSortDescriptor *sort = [NSSortDescriptor

sortDescriptorWithKey:@"age" ascending:NO];

//将排序插入到查询请求

request.sortDescriptors = [NSArrayarrayWithObject:sort];

self.pername = self.selTextfield.text;

if (self.pername != nil) {

NSString *str = [NSString stringWithFormat:@"*%@*",self.pername];

//设置条件过滤(搜索name中包含字符串"Itcast-1"的记录,注意:设置条件过滤时,数据库SQL语句中的%要用*来代替,所以%Itcast-1%应该写成*Itcast-1*)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@", str];

//将过滤条件加入查询请求

request.predicate = predicate;

//建立错误处理

//执行请求

NSError *error = nil;

//执行请求

NSArray *objs = [context executeFetchRequest:request error:

&error];

//判断:如果出现错误

if (error) {

//异常处理

[NSException raise:@"查询错误" format:@"%@", [error localizedDescription]];

}

//遍历数据

for (NSManagedObject *obj in objs) {

//NSLog(@"name=%@", [obj valueForKey:@"name"]);

selectedObject = obj;

//显示查询结果

//1.姓名

self.nameTextFiled.text = [obj valueForKey:@"name"];

//年龄

self.ageTextField.text = [obj valueForKey:@"age"];

//3.身份证号

//(1).创建card实体对象

NSManagedObject *card = [NSEntityDescriptioninsertNewObjectForEntityForName:@"IDCard"inManagedObjectContext:context];

//(2).取出card

card = [obj valueForKey:@"card"];

//(3).身份证号

self.idNUmberTextField.text = [card valueForKey:@"no"];

}

}

}

- (IBAction)deletButtonClick:(id)sender

{

//直接用上下文删除查询出来的实体对象

[contextdeleteObject:selectedObject];

//错误处理

NSError *error = nil;

//试做一次更新操作看是否删掉,如果没有删掉则再做更新操作会报告错误

[context save:&error];

//判断:如果报告错误

if (error)

{

//说明没有删掉,异常处理

[NSException raise:@"删除错误" format:@"%@",[error localizedDescription]];

}

//判断:如果没有报告错误

else

{

//输出删除成功

NSLog(@"删除成功!");

//所有显示框置空

self.nameTextFiled.text = @"";

self.ageTextField.text = @"";

self.idNUmberTextField.text = @"";

}

}

@end

Core Data实例的更多相关文章

  1. iOS 数据持久化(3):Core Data

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  2. obj-c编程15[Cocoa实例04]:基于Core Data的多文档程序示例[未完待续]

    上一个例子我们使用的模式数据实际上是基于一个Person数组,现在我们看一下如何使用Cocoa中的Core Data框架支持,几乎不用写一行代码,完成模式数据的建立. 我们这里模式的元素使用的是Car ...

  3. iOS之Core Data及其线程安全

    一.简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对 ...

  4. Core Data的一些常见用法

    一.简介 Core Data是一个纯粹的面向对象框架,其本质就是一个ORM(对象关系映射:Object Relational Mapping),能以面向对象的方式操作SQLite数据库.在实际开发中绝 ...

  5. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  6. 我为什么用 SQLite 和 FMDB 而不用 Core Data

    凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和 ...

  7. 《驾驭Core Data》 第三章 数据建模

    本文由海水的味道编译整理,请勿转载,请勿用于商业用途.    当前版本号:0.1.2 第三章数据建模 Core Data栈配置好之后,接下来的工作就是设计对象图,在Core Data框架中,对象图被表 ...

  8. 《驾驭Core Data》 第二章 Core Data入门

    本文由海水的味道编译整理,请勿转载,请勿用于商业用途.    当前版本号:0.4.0 第二章 Core Data入门 本章将讲解Core Data框架中涉及的基本概念,以及一个简单的Core Data ...

  9. 《驾驭Core Data》 第一章 Core Data概述

    <驾驭Core Data>系列教程综合了<Core Data for iOS>,<Learning Core Data for iOS>,<Core Data ...

随机推荐

  1. aop postsharp的使用:在方法进入/成功/失败/退出时获取方法名和参数值

    1.nuget安装postsharp 2.编写attribute标记 [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMult ...

  2. ajax方法XHR.readyState五种状态与示例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Logger性能优化

    最近排查线上问题,无意中发现了Logger堵塞的情况,排查的同时也做下总结,做个笔记,以防备用. 先上图,看下实际堵塞的情况 从图中可以清楚的看到标黄的都在 waiting to lock <0 ...

  4. daemontools检测进程,退出拉起

    一.学习的原因: 为了实现在服务异常停止运行后,有一个监控程序能监控到它,并自动重新启动这个服务.以下以tomcat为例子 二.工具supervise Daemontools是一个包含了很多管理Uni ...

  5. lua中使用table实现类和继承

    --因为只有当读写不存在的域时,才会触发__index和__newindex classA = {className = "classA",name="classAIns ...

  6. Genymotion模拟器拖入文件报An error occured while deploying the file的错误

    今天需要用到资源文件,需要将资源文件拖拽到sd卡中,但老是出现这个问题: 资源文件拖不进去genymotion.查看了sd的DownLoad目录,确实没有成功拖拽进去. 遇到这种问题的,我按下面的思路 ...

  7. Unity使Text 文字逐个出现

    Text tex; string s="Unity使Text 文字逐个出现"; //字符出现间隔 waitTime = 0.3f; // float speed=0; //方法一 ...

  8. qt 样式表基本用法

    Qt样式表 QT样式表参考CSS层叠样式表设计,不同之处在于QT样式表应用于Widget世界. 可以使用QApplication::setStyleSheet()函数设置到整个应用程序上,也可以使用Q ...

  9. Opencv2.4.13与Visual Studio2013环境搭建配置教程

    转载:http://www.jb51.net/article/108943.htm 一.安装包的下载与安装 Opencv可免费到官网上去下载,opencv是国外软件,在下载是由于受资源的限制,可能会出 ...

  10. java jdk切换出现的问题 jdk切换失败(转)

    1.问题:同时装两个版本的jdk时出现的问题(本次是1.7和1.8的版本),因为eclipse要求1.8版本的,但是我的Windows默认版本是1.7,导致无法启动eclipse 2.因为做开发的时候 ...