Core Data实例
#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实例的更多相关文章
- iOS 数据持久化(3):Core Data
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...
- obj-c编程15[Cocoa实例04]:基于Core Data的多文档程序示例[未完待续]
上一个例子我们使用的模式数据实际上是基于一个Person数组,现在我们看一下如何使用Cocoa中的Core Data框架支持,几乎不用写一行代码,完成模式数据的建立. 我们这里模式的元素使用的是Car ...
- iOS之Core Data及其线程安全
一.简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对 ...
- Core Data的一些常见用法
一.简介 Core Data是一个纯粹的面向对象框架,其本质就是一个ORM(对象关系映射:Object Relational Mapping),能以面向对象的方式操作SQLite数据库.在实际开发中绝 ...
- iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】
在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...
- 我为什么用 SQLite 和 FMDB 而不用 Core Data
凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和 ...
- 《驾驭Core Data》 第三章 数据建模
本文由海水的味道编译整理,请勿转载,请勿用于商业用途. 当前版本号:0.1.2 第三章数据建模 Core Data栈配置好之后,接下来的工作就是设计对象图,在Core Data框架中,对象图被表 ...
- 《驾驭Core Data》 第二章 Core Data入门
本文由海水的味道编译整理,请勿转载,请勿用于商业用途. 当前版本号:0.4.0 第二章 Core Data入门 本章将讲解Core Data框架中涉及的基本概念,以及一个简单的Core Data ...
- 《驾驭Core Data》 第一章 Core Data概述
<驾驭Core Data>系列教程综合了<Core Data for iOS>,<Learning Core Data for iOS>,<Core Data ...
随机推荐
- easyui 删除行的时候 引起的 bug
问题场景 easyui 编辑里 有删除行的功能 文档提供的方法如下 $aplgrid为grid 的容器 ind 为当前行的索引 $aplgrid.datagrid('deleteRow', ind); ...
- 【小记录】关于dojo中的on事件
今天碰到一个现象,若是一个函数中存在一个on事件(例如点击事件),在该函数连续触发两次之后在去触发里面的on事件,会发现改时间所对应的函数被调用了两次,若父函数被连续触发N次后再取触发on事件,其对应 ...
- 颜色矩原理及Python实现
原理 颜色矩(color moments)是由Stricker 和Orengo所提出的一种非常简单而有效的颜色特征.这种方法的数学基础在于图像中任何的颜色分布均可以用它的矩来表示.此外,由于颜色分布信 ...
- Linux ->> UBuntu 14.04 LTE下设置静态IP地址
UBuntu 14.04 LTE设置IP地址和一些服务器版本的Linux还不太一样.以Centos 7.0为例,网卡IP地址的配置文件应该是/etc/sysconfig/network-scripts ...
- tcp-full.cc
ns2--tcp-full.cc /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */ /* * Copy ...
- 记一次JVM调优之旅(斗争full gc)
俗话说技多不压身,当年苦读<深入理解JVM>还专门整理了笔记,现在就用上了- 笔记 http://www.cnblogs.com/syjkfind/p/3901774.html [症状] ...
- was缓存以致web.xml更改无效
was缓存导致web.xml更改无效 在项目中经常遇见这样的问题:修改应用的配置文件web.xml后,无论重启应用还是重启WebSphere服务器,都不能重新加载web.xml,导致修改的内容无效. ...
- 更新UI的几种方式
在学习Handler的过程中牵涉到UI的更新,在这里就总结一下更新UI的四种方式吧,用法都比较简单,直接看代码就可以了. 一.使用Handler的post方法 新建项目,修改MainActivity代 ...
- 「hihocoder1413 Rikka with String」
题目 哈哈哈哈哈哈哈哈哈哈我还没自闭 好像前后调了两天了 哈哈哈哈哈哈哈哈哈哈我还没自闭 这道题就是给定一个小写字母串,回答分别把每个位置上的字符替换为\(#\)后的本质不同的子串数 首先就是跨过这个 ...
- POJ 3368 Frequent values 【ST表RMQ 维护区间频率最大值】
传送门:http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS Memory Limit: 65536K Total S ...