核心数据中的两个不同的提取请求

时间:2012-08-03 23:01:34

标签: objective-c ios core-data nsfetchrequest

我注意到在一个完整的Core Data进程中有两个不同的获取请求。

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

抓取请求B : FRC实例是init,带有另一个获取请求,从内存中获取数据(指定上下文)到内存,这会自动发生,因此不需要“执行”此提取。

获取请求A和获取请求B之间的连接

1.A和B的背景必须是同一个

2.获取B的结果是获取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];
}

1 个答案:

答案 0 :(得分:1)

获取请求A.正确。

获取请求B.几乎正确。您不知道FRC在哪里获取数据,如果它在内存中或必须从商店中检索。你不必关心,这就是FRC的美丽。

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

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

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

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