【问题标题】:NSFetchedResultsController / Parent-ChildNSFetchedResultsController / 父子
【发布时间】:2011-12-19 21:37:35
【问题描述】:

我正在开发我的第一个由 Core Data 支持的应用程序,但无法弄清楚如何正确设置 NSFetchedResultsController。我有两个实体:

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

我有两个视图(每个都继承自 UITableViewController,每个都由 NSFetchedResultsController 支持)。第一个视图是一个UITableView,它显示了所有List 项。选择行时,它会按下第二视图。

我在视图控制器中有一个名为 @property (strong, nonatomic) List *selectedList 的属性,我在推送视图之前将其分配给选定的 List

我在设置时遇到的问题是让第二个视图只显示父对象为选定的ListListItem 对象。我知道这属于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;
}    

我是否需要添加某种排序描述符,或者答案是否在于其他内容?谢谢!

【问题讨论】:

    标签: iphone core-data nsfetchedresultscontroller nssortdescriptor


    【解决方案1】:

    您需要NSPredicate 来选择ListItems,其中selectedList 与其list 属性匹配。

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

    这里需要注意一件事,那就是谓词会根据selectedList 而改变,这意味着获取请求会改变。如果您要更改获取请求,Apple 会在 NSFetchedResultsController Class Reference 中提供此警告。

    您不能简单地更改获取请求来修改结果。如果 要更改获取请求,您必须:

    1. 如果您正在使用缓存,请将其删除(使用 +deleteCacheWithName:)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多