CoreData笔记

       CoreData提供了对象-关系映射(ORM)的功能,能够将OC对象转化成数据,保存在SQLit在e数据库文件或者XML中,也能够将保存在数据库中的数据还原成OC对象。

CoreData常用的类中如下:

1.NSManagedObjectContext 被管理对象上下文

2.NSPersistentStoreCoordinator 持久化存储协调器

3.NSManagedObjectModel  被管理数据模型

4.NSManagedObject 被管理数据记录

5.NSFetchRequest 获取数据的请求

6. NSEntityDescription 实体结构

 类之间的结构如下图:

相当于表格结构

插入数据

-(void)insert

{

           Student *stu = [NSEntityDescription insertNewObjectForEntityForName:@"Student"              inManagedObjectContext:_context];

           stu.name = @"jyq";

           stu.hight = @170;

           stu.birthday = [NSDate date];

           NSError *error = nil;

           [_context save:&error];

           if (error) {

                     NSLog(@"insert error:%@",error);

          }

}

更新数据库

-(void)update

{

           NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];

           NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"laoliu"];

           request.predicate = pre;

           NSArray *students = [_context executeFetchRequest:request error:nil];

          for (Stuentd *stu in students) {

                   stu.hight = @173;

          }

          [_context save:nil];

}

删除数据

-(void)delete

{

         NSFetchRequest *reqest = [NSFetchRequest fetchRequestWithEntityName:@"Student"];

         NSPredicate *pre = [NSPredicate predicateWithFormat:@"name=%@",@"laoliu"];

          reqest.predicate=pre;

        NSArray *students = [_context executeFetchRequest:reqest error:nil];

         for (Student *stu in students) {

                [_context deleteObject:stu];

         }

        [_context save:nil];

}

查询数据库

-(void)fetch 

{

          NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];

          NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"hight" ascending:NO];

           request.sortDescriptors = @[sort];

          NSPredicate *pre = [NSPredicate predicateWithFormat:@"hight>175"];

          request.predicate = pre;

          NSError *error =nil;

         NSArray *students = [_context executeFetchRequest:request error:&error];

         if (error) {

               NSLog(@"fetchResult error:%@",error);

         }

         for (Student*stu in  students) {

                  NSLog(@"stu:name:%@,hight:%@,brt:%@",stu.name,stu.hight,stu.birthday );

         }

}

当数据比较复杂时,可能需要建多个表,多表关联:需要设置relationships

主要设置:

Type:To One 一对一 ToMany  一对多

Delele Rule:

//NSNoActionDeleteRule--No Action

无任何删除动作。

如:A表中的关系字段值与B表中的键值相对应,当删除B表中的数据时,A中的关系字段值保持不变。

//NSNullifyDeleteRule--Nullify

空删除规则。

如:A表中的关系字段值与B表中的键值相对应,当删除B表中的数据时,A中的关系字段值变为了NULL。

//NSCascadeDeleteRule --Cascade

联动删除规则。

如:当把A表中的关系设置为联动删除时,哪么A表在删除数据时候,将对联动表的数据也进行删除。

//NSDenyDeleteRule --Deny

依赖删除规则。

//如删除部门时必须确保该部门员工表中的数据为空或转到别处,否则删除失败。

 CoreData  多线程问题

    在多线程编程环境下,容易出现每个上下文数据不一致问题,最好一个线程一个上下文,如何需要修改数据,尽量有一个线程的上下文去修改,然后通知其他上下文进行修改,通知方法:上下文修改时(save 方法调用)时系统会发送NSManagedObjectContextDidSaveNotification通知,我们许监听这个通知,然后修改上下文如:[_context mergeChangesFromContextDidSaveNotification:notice];

参考资料:

http://www.cppblog.com/ipzyh/articles/CoreData.html

系列文章:http://blog.csdn.net/jasonblog/article/details/8528850

你可能感兴趣的:(CoreData笔记)