#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