CoreData的基本操作

 Managed Object Model(被管理对象模型):
–数据库的轮廓,或者结构。包含了各个实体的定义信息
     Persistent Store Coordinator (持久性数据协调器):
– 数据库连接库,在这里设置数据存储的名字和位置,以及数据存储的时机
     Managed Object Context (被管理对象上下文):
–数据的实际内容,基本上,插入数据,查询数据,删除数据的工作都在这里完成
写模块是怎样运作的呢?
1,应用程序先创建或读取模型文件(后缀为xcdatamodeld)生成 NSManagedObjectModel 对象。Document应用程序是一般是通过 NSDocument 或其子类 NSPersistentDocument)从模型文件(后缀为 xcdatamodeld)读取。
2,然后生成 NSManagedObjectContext 和 NSPersistentStoreCoordinator 对象,前者对用户透明地调用后者对数据文件进行读写。
3,NSPersistentStoreCoordinator 负责从数据文件(xml, sqlite,二进制文件等)中读取数据生成 Managed Object,或保存 Managed Object 写入数据文件。
4,NSManagedObjectContext 参与对数据进行各种操作的整个过程,它持有 Managed Object。我们通过它来监测 Managed Object。监测数据对象有两个作用:支持 undo/redo 以及数据绑定。这个类是最常被用到的。
5,Array Controller, Object Controller, Tree Controller 这些控制器一般与 NSManagedObjectContext 关联,因此我们可以通过它们在 nib 中可视化地操作数据对象。
 
 
如果希望看到内部是如何执行的,可以打开调试功能:
在运行控制中,选择Arguments选项,在Arguments Password On Launch中添加以下命令:
-com.apple.CoreData.SQLDebug 1
 
使用CoreData创建实体
1._2_CoreData.xcdatamodeld中选择"Add Entity”.
添加实体Person,,为Person添加属性,
2.创建实体对象
Person *person = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Person class]) inManagedObjectContext:self.managedObjectContext];
person.name = @"Tom";
person.age = [NSNumber numberWithInt:22];
person.gender = @'M';
3.保存实体的方法
[self saveContext];
4.查询实体对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Person class])];
5.设置request属性
 //定义查询条件
//    [request setPredicate:<#(NSPredicate *)#>];//设置谓词对象,相当于where子句
 
    //定义排序对象(设置依靠哪个字段进行排序,例如:以姓名,性别为例)
    NSSortDescriptor *ageSort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];//yes升序,no降序
    NSSortDescriptor *genderSort = [NSSortDescriptor sortDescriptorWithKey:@"gender" ascending:YES];
    //在排序过程中,首先以年龄为主关键字,如果年龄相同,则已性别为排序字段。
    [request setSortDescriptors:@[ageSort,genderSort]];
    //执行查询
    NSError *error = nil;
    NSArray *persons = [self.managedObjectContext executeFetchRequest:request error:&error];
 
    if (!error)
    {
        [persons enumerateObjectsUsingBlock:^(Person *person, NSUInteger idx, BOOL *stop)
          {
            NSLog(@"name:%@,age:%@,gender:%c",person.name,person.age,(char)[person.gender integerValue]);
        }];
    }
在CoreData中删除对象实体的方法:
//取出CoreData中的数据
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Book class])];
NSError *error = nil;
NSArray *fetchedResult = [self.managedObjectContent executeFetchRequest:request error:&error];
如果通过TableView对数据进行删除操作,步骤如下:
1.在CoreData中进行删除数据,然后进行保存
[self.managedObjectContent deleteObject:book];
NSError *error = nil;
 [self.managedObjectContent save:&error];
 if (error) {
      NSLog(@"删除失败");
 }
2.在保存数据源的数组中进行删除对象
[self.books removeObject:book];
3.局部刷新单元格
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
 
全部评论

相关推荐

蜀黍在线等offer:对面什么神仙解读,智商堪忧
点赞 评论 收藏
分享
07-23 22:01
已编辑
梧州学院 Java
第一次面试,广东小厂,太紧张了,感觉机会不是很大,很多地方说得不好。面了二十分钟接下来是面试问的问题1.介绍一下项目,有什么功能太紧张了,回答有点卡壳2.了解的数据库有哪些,说一下MySQL的索引优化我说了一下索引的知识,但是没了解过索引优化,然后他让我自由发挥说一下我了解的MySQL知识,后面讲了数据库的事务,隔离级别,索引的b+树,太紧张,很多都没说出来,卡住了,让他下一个问题。3.spring&nbsp;cloud里面有哪些组件跟组件的作用讲了,nacos,sentinel,gateway,负载均衡,openfeign4.MinIO做文件存储,如果有十个g的上传,应该如何提高上传和下载的效率这个不会,没了解过,只说了用mq提高响应速度5.redis在项目中起到什么样的作用缓存热门信息,做排行榜,redis分布式锁做限制请求6.redis怎么保证跟数据库一致性这个答得不好7.怎么提高接口的响应速度只说了慢sql和mq8.怎么理解Java中的多态举例只说了重载跟重写9.介绍一下springioc和aop10.bean的生命周期这两个还可以八股问完了,我问面试评价,说我太紧张了,可以放松一些(确实第一次面试,听录音回放全程在鹅鹅鹅饿,感觉过不了),问我能不能接受出差,可能去深圳做技术支持,问我多久到岗,问他主要工作内容是负责开发吗,他说可能有部分时间不在公司要去出差。应该是挂了,叫我过两天等通知。
想当java高手:报喜,面试已经通过了,准备下周一入职,月薪3000
查看10道真题和解析
点赞 评论 收藏
分享
真三hjdlxn:这么能吹还能找不到实习啊? 市分行写TOP投行,2个月的实习写半页。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务