FetchedResultsController与Core Data

NSFetchedResultsController是为了让视图及时响应Model层的变化而设计的,更具体的将是配合刷新UITableView上的数据。

一般而言,NSFetchedResultsController的实例是由UITableViewController的实例初始化并持有。

创建后,我们将给它分配一个代理(NSFetchedResultsControllerDelegate),当Core Data中的model有变化时,通过代理通知到对应的tableView。

  1. 对象的新增:新增的对象无法关联到fetchedResultsController,一般是通过 [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:managedObjectContext]的方式初始化并赋值,并保存( [managedObjectContext save:&error]),此处采用的是一致的managedObjectContext,会触发NSFetchedResultsChangeInsert通知。
  2. 对象的更新:在某些需求中,对象可能是后台异步得到json数据,然后同步进数据库中的。直接对该对象更新,并保存( [managedObjectContext save:&error])。
  3. 对象的删除:通过在一致的managedObjectContext上删除对应的model对象,会触发NSFetchedResultsChangeDelete通知。并且会将其相关的cascade关系的对象一起删除,无需单独操作。 [post.managedObjectContext deleteObject:post];

官方推荐的方式,是尽量在代理的didChangeObject方法中处理tableView上对section或者row的更新。不管对对象的操作是通过NSArray还是NSFetchedResultsController来获取,亦或是通过insertNewObjectForEntityForName方法去新增,只要是在绑定到代理上的那个controller对象所包含的结果集内的对象有变化,都会触发代理中的didChangeObject方法。

对于对象相关的关系对象变化,比如post对象有个owner对象关系,owner发生了变化,如果会影响结果集,同样会触发post的didChangeObject方法,反之则不会。

遇到最多的问题是相关的model有了更新,并在上下文保存了,但关联的代理的didChangeObject方法中没有被触发,总结了一下,原因主要有几个:

1. managedObejctContext不一致

2. 分析下fetch到controller对应的predicate是否包含受影响的该model,并检查由于该model的相关属性变化后,它对应在结果集中是新增/更新/删除操作,那么在didChangeObject中就会触发到相应的NSFetchedResultsChange

3. 当前返回的controller的delegate是否绑定到对应的代理上了

相关资料:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html

时间: 2024-10-29 19:13:30

FetchedResultsController与Core Data的相关文章

ios开发:Core Data概述

Core Data 概述 2005年的四月份,Apple 发布了 OS X 10.4,在这个版本中 Core Data 框架发布了.Core Data本身既不是数据库也不是数据库访问框架.相反,Core Data是一个完整的数据模型解决方案.可以简单理解为对持久层的封装,使得我们可以通过可视化建立数据模型,简化数据存取.即使不懂SQL语句,也依然可以使用Core Data.因为Core Data将底层的数据库SQL语句封装成了一套API,并可通过可视化操作来建立数据库的模型和表之间的关系,它甚至

OC开发_Storyboard——Core Data

一 .NSManagedObjectContext 1.我们要想操作Core Data,首先需要一个NSManagedObjectContext2.那我们如何获得Context呢:创建一个UIManagedDocument 二.UIManagedDocument 1.UIManagedDocument是一系列用于管理存储的机制:  [将Core Data数据库放入某存储空间,相当于是管理core data 数据库的存储,所以我们只需要打开和存储]2.那我们如何得到UIManagedDocumen

Core Data

简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的.简单地用下图描述下它的作用: 左边是关系模型,即数据库,数据库里面有张person表,person表里面有id.name.age三个字段,而且有2条记录: 右

我为什么用 SQLite 和 FMDB 而不用 Core Data

转:http://segmentfault.com/a/1190000000363392 编者注:文章的"我"是指原作者. 凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和精力去写自己的系统去代替它.真的,使用Core Data吧. 为什么我不使用Core Data Mike Ash写到: 就我自己而言,我不是个狂热粉丝.我发现API是

Core Data存储自定义类型数据

目录: 一.使用CoreData存储基本数据 二.使用CoreData存储自定义类型数据 简单介绍CoreData CoreData是iOS编程中使用持久化数据存储的一种方式,我们知道CoreData并不是数据库本身,而是Apple提供的对象持久化技术--Object Persistent technology.CoreData框架为我们的数据变更.管理.对象存储.读取和恢复提供了支持.下面我们来尝试创建一个简单的CoreData Project. 操作 1. 打开x-code,为你的proje

Core Data使用之一(Swift): 保存

Core Data 用于永久化数据,它是基于SQLite数据库的保存一门技术. 那么,在Swift中,它是如何实现的呢? 首先,需要新建一个模板,打开工程中的xcdatamodeld文件,点击“Add Entity” ,这时候,就创建的一个模板.之后,可以修改模板的名称为自己想要的名称.然后,在Attributes里面,点击“+”,添加字段并修改类型. 然后,在代码里面 “import CoreData”.接着,用NSManagedObject来保存对象,它可以转换成任何对象.它的类型是字典.

Chapter 23 Core Data

1.  Core Data is only able to store certain data types in its store, and UIImage is not one of these types. Instead, you declared the UIImage as transformable. With a transformable attribute, Core Data will convert the object into NSData when saving,

Core Data浅谈系列之十 : 关于数据模型中实体的属性

之前写了<Core Data浅谈系列汇总>,今天稍微回顾了下,做些补充. 在这个系列的第一篇<基础结构>中(2013年1月份的文章,时间过得好快啊!),有简单带过Entity的Attribute: 数据类型.布尔值统一用NSNumber来表示: 字符串类型用NSString表示: 时间类型用NSDate表示: 二进制数据类型用NSData表示: 非标准类型用Transformable来表示: 而Attribute还有其自身的Properties,比如Transient表示不用持久化

iOS Core data多线程并发访问的问题

大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的特殊性,与大家分享一下. 这个问题似乎在7.0.1以前的版本上并不存在:不过后来我升级版本到了7.0.4.app的模型很简单,主线程在前台对数据库进行读写,而后台线程不断地做扫描(只读).为此每个线程中各创建了一个NSManagedObjectContext. 这个模型其实有点奇怪,因为普遍的模型是