0

我注意到在一个完整的核心数据进程中有两个不同的获取请求。

获取请求 A:上下文 (MOC) 实例通过创建获取请求并执行它 (executeFetchRequest) 将数据从磁盘获取到内存。

获取请求 B:FRC 实例与另一个获取请求一起初始化,从内存(指定上下文)获取数据到内存,这是自动发生的,因此无需“执行”此获取。

Fetch 请求 A 和 Fetch 请求 B 之间的连接

1.A和B的上下文必须相同

2.fetch B的结果是fetch A结果的子集

问题 我想知道我的理解是否绝对正确。请指出任何不准确的陈述和误解。谢谢。

示例代码

获取 A(显式执行):从磁盘到内存

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

request.predicate = [NSPredicate predicateWithFormat:@"unique = %@", [flickrInfo 
objectForKey:FLICKR_PHOTO_ID]]; 

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]; 

request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

NSError *error = nil;

// execute the fetch    
NSArray *matches = [context executeFetchRequest:request error:&error];  

获取 B(自动):从内存到内存

- (void)setupFetchedResultsController 
{
    NSFetchRequest *request = 
        [NSFetchRequest fetchRequestWithEntityName:@"Photo"];
    request.sortDescriptors = 
        [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"title"
                                                                                     ascending:YES
                                                                                      selector:@selector(localizedCaseInsensitiveCompare:)]];
    request.predicate = [NSPredicate predicateWithFormat:@"whoTook.name = %@", self.photographer.name];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.photographer.managedObjectContext
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];
}
4

1 回答 1

1

获取请求 A. 正确。

获取请求 B。几乎正确。您不知道 FRC 从哪里获取数据,是在内存中还是必须从存储中检索。您不必在意,这就是 FRC 的美妙之处。

关系 1. 相同的上下文。错误的。上下文与关系无关。两个实体 A 和 B 必须在同一个数据模型中,而不是在上下文中。上下文主要用于获取和保存。

关系 2. 子集。错误的。如果您获取实体 A,您可以访问它的关系,但您不知道在什么时候实际检索了多少数据(这称为故障)。核心数据将为您解决这个问题。因为可以以任何方式建立关系(一对多、多对多、一对一)并且可能为空,所以您关于子集的陈述是不正确的。例如:

// A --one-to-many--> B
NSSet *bSet = anAObject.bRelationship; 

在这种情况下,该集合确实包含所有 B 实体的子集(如果还有其他实体),但您会看到这只是一个特例。在上面的代码中,您还可以看到通过点符号访问关系实体是多么方便。

于 2012-08-04T10:47:32.337 回答