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