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 扩展名的文件,以图形化的形式编辑数据模型,这里包括了

 EntitiesPropertiesAttributesRelationships四个概念,这里跟关系型数据库有很大的相似点。

 首先理解几个概念:

 ModelEntityAttributeRelationship

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

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

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

   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数据库文件的路径 并创建

    //1documents路径

    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"];

    

    //设置PersonCard之间的关联关系

    [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