zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [hdu3853]LOOPS(概率dp)
    [poj2096]Collecting Bugs(概率dp)
    lintcode-42-最大子数组 II
    lintcode-39-恢复旋转排序数组
    lintcode-36-翻转链表 II
    lintcode-34-N皇后问题 II
    lintcode-33-N皇后问题
    lintcode-32-最小子串覆盖
    lintcode-31-数组划分
    lintcode-30-插入区间
  • 原文地址:https://www.cnblogs.com/chenhaosuibi/p/3444741.html
Copyright © 2011-2022 走看看