1

在过去的几天里,我一直在试图弄清楚如何实现这一目标,但我的知识很少。

我设计了三个实体 List <<-->> Item <<-->> Store 在核心数据模型设计器中。他们每个人都只有一个属性,称为“名称”。

目标是选择一个列表,然后显示按商店分组的列表中的所有项目。

我试过使用:

    // Set entity.
    entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set object filters.
    predicate = [NSPredicate predicateWithFormat:@"ANY list.name == %@", self.list.name];
    [fetchRequest setPredicate:predicate];

    // Set FRC
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"store.name" cacheName:nil];

错误:

'Invalid to many relationship in setPropertiesToFetch: (store.name)'

这种方式也可以手动填充行(我还不知道如何):

    // Set entity.
    entity = [NSEntityDescription entityForName:@"Store" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set object filters.
    predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(item.list, $x, $x.name == %@).@count > 0", self.list.name];
    [fetchRequest setPredicate:predicate];

    // Set FRC
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"name" cacheName:nil];

错误:

'Only allowed one toMany/manyToMany relationship in subquery expression collection (SUBQUERY(item.list, $x, $x.name == "List02"))'

并且还尝试了 Fetched Properties 和其他无法到达的方式。

有任何想法吗?

问候。佩德罗。

4

2 回答 2

1

好的,这是解决方案(danypata 和 Martin R 给我钥匙)。

为此,您应该添加一个新实体以打破多对多关系。最终的 Core Data 模型是:List <<-->> Item <-->> ItemStore <<--> Store。“ItemStore”实体不需要任何属性,只要关系即可。

编码...

- (NSFetchedResultsController *)fetchedResultsController
{
    [...]

    // Set entity.
    entity = [NSEntityDescription entityForName:@"ItemStore" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];


    // Set object filters.
    predicate = [NSPredicate predicateWithFormat:@"ANY item.list.name == %@", self.list.name];
    [fetchRequest setPredicate:predicate];

    // Edit the sort key as appropriate.
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"item.name" ascending:YES];
    sortDescriptors = @[sortDescriptor];
    [fetchRequest setSortDescriptors:sortDescriptors];

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

    // Set FRC.
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"store.name" cacheName:nil];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [...]
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    Item *item;
    ItemStore *itemStore;

    [...]

    itemStore = (ItemStore *)[self.fetchedResultsController objectAtIndexPath:indexPath];
    item = itemStore.item;
    cell.textLabel.text = item.name;

    [...]

 }

最后注意事项:

  • 打破与新实体(ItemStore)的多对多关系和两个一对多关系(Item <-->> ItemStore & ItemStore <<--> Store)。
  • 由于项目的“商店”关系是可选的(在我的模型中),没有商店的项目不会被检索,如果你想这样做,你应该默认将它们分配给“无商店”对象。

谢谢大家。佩德罗。

于 2013-05-12T21:39:56.067 回答
0

正如已经指出的那样,如果一件商品可以在多个商店中,则无法按商店获取商品和分组。但是,在表格视图中使用NSFetchedResultsControllerfor in display 或类似的东西,这仍然是可能的(并且很常见)。

在这种情况下,只需获取您想要分组的实体Store。相应地调整您的表格视图datasource方法:

节数:

return _fetchedResultsController.fetchedObjects.count

部分标题:

Store *store = _fetchedResultsController.fetchedObjects[indexPath.section];
return store.name;    

部分行数:

Store *store = _fetchedResultsController.fetchedObjects[indexPath.section];
return store.items.count;

商店中的一件商品:

Store *store = _fetchedResultsController.fetchedObjects[indexPath.section];
Item *item = [[store.items sortedArrayUsingSortDescriptors:@[
     [NSSortDescriptor sortDescriptorWithKey:@"sortAttribute" ascending:YES]]
     objectAtIndex:indexPath.row];
// configure cell with information from item.

因此,尽管这是可能的,但也许您仍想重新考虑您的数据模型。一件商品在多个商店中真的有意义吗?如果不是,您可以使用普通的香草提取结果控制器。

于 2013-05-11T20:13:40.593 回答