4

我正在研究我的第一个核心数据支持的应用程序,并且无法正确地设置NSFetchedResultsController。我有两个实体:NSFetchedResultsController/Parent-Child

/-----------\  /-----------\ 
| List  |  | ListItem | 
| --------- |  | --------- | 
| listName |  | itemName | 
| --------- |  | --------- | 
| listItems |<---->> | list  | 
\ ---------/  \ ---------/

我有两个观点(分别来自UITableViewController继承和各由NSFetchedResultsController支持)。第一个视图是UITableView,它显示List项目的所有项目。当选中一行时,它将推动第二个视图。

我在视图控制器中有一个名为@property (strong, nonatomic) List *selectedList的属性,我在选择List之前将其分配,然后再按下视图。

我在设置时遇到的问题是,第二个视图仅显示ListItem对象,其父对象为List。我知道这属于NSFetchedResultsController,但我不知道在哪里。

这里是我的代码:

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (__fetchedResultsController != nil) { 
     return __fetchedResultsController; 
    } 

    // Set up the fetched results controller. 
    // Create the fetch request for the entity. 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ListItem" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Set the batch size to a suitable number. 
    [fetchRequest setFetchBatchSize:20]; 

    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Detail"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    NSError *error = nil; 
    if (![self.fetchedResultsController performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return __fetchedResultsController; 
}  

我是否需要添加某种排序描述符,或者其答案是否是别的东西?谢谢!

回答

1

您需要一个NSPredicate来选择ListItem s,其中selectedList匹配其list属性。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list == %@", self.selectedList]; 
[fetchRequest setPredicate:predicate]; 

有一两件事要注意的这里,那就是根据selectedList意义的读取请求将改变谓词将发生变化。如果您要更改提取请求,Apple会在NSFetchedResultsController Class Reference中发出此警告。

您不能简单地更改获取请求来修改结果。如果 你想改变的读取请求时,你必须:

  1. 如果您使用的是高速缓存,删除它(使用+deleteCacheWithName:)。

  2. 通常,如果要更改提取请求,则不应使用缓存。

  3. 更改提取请求。调用-performFetch: