Coredata groupby 属性 iOS

Posted

技术标签:

【中文标题】Coredata groupby 属性 iOS【英文标题】:Coredata groupby properties iOS 【发布时间】:2015-08-23 17:17:42 【问题描述】:

我想在ios CoreData 中实现一个SQL 查询,这是我的查询。

Select * from table group by my_field1 order by my_field2

我想显示属性my_field1GroupBy,但我收到默认值不能为零的错误。

这是我的代码:

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"myentity"];
[fetchRequest setResultType:NSDictionaryResultType];
fetchRequest.propertiesToGroupBy = [NSArray arrayWithObject:@"my_field1"];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"my_field2" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

  NSMutableArray *data = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

如何在 Coredata 中按 Group by 属性过滤结果。

我想要的结果是:

我的表格数据:

my_field1      |      my_field2     |     my_field3

1                     ABC                 DEF
1                     GHI                 JKL
1                     MNO                 PQR
2                     DEF                 DEF

我的预期结果:

 my_field1      |      my_field2     |     my_field3

1                      MNO                 PQR
2                      DEF                 DEF

我期待为 my_field1 找到最后一行,因为我也在查询中包含 order_by。

【问题讨论】:

你想获得 values "1", "MNO" and "PQR" (and "2", "DEF" and "DEF"), 还是做你想要具有这些值的 NSManagedObjects 吗? 【参考方案1】:

您必须将您选择的其他字段添加到propertiesToGroupBy 数组中。否则,它怎么知道如何处理其他领域?例如,假设您有以下数据:

   my_field_1     my_field_2

      John          Smith

      John          Jones

如果您仅按 my_field_1 进行分组,则会导致:

    my_field_1     my_field_2

      John          ??????

在此示例中,您还需要按 my_field_2 分组或应用一些聚合函数。

在您的示例中,您选择了表中的所有字段,因此可能有许多字段需要分组,使用计数/总和/等进行聚合,或者通过将它们添加到 fetchRequest.propertiesToFetch = 并仅包括所需的属性。

编辑

NSEntityDescription *entity = [NSEntityDescription entityForName:@"myentity" inManagedObjectContext:managedObjectContext];
NSDictionary *propertiesByName = [entity propertiesByName];
fetchRequest.propertiesToFetch = @[[propertiesByName objectForKey:@"my_field_2"],[propertiesByName objectForKey:@"my_field_3", [propertiesByName objectForKey:@"my_field_4"]];

【讨论】:

好的,那么当我运行这个查询时,我如何选择my_field3, my_field4, my_field5Select my_field3, my_field4, my_field5 from table group by my_field1 编辑只是针对您的评论...您如何选择。正如我在我的 OP 中所说,任何你想分组的东西都需要选择。您选择的任何内容也需要在 group by 中或应用聚合函数。否则,您的查询没有意义。 那么你的问题需要更清楚。请包含您想要查询的示例数据,以及您期望的输出结果。 根据您的编辑,为什么需要分组依据?您似乎只想选择@"my_field_2" 等于字符串@"MNO" 或@"DEF" 的实体? 不,不,我想选择最后一行,这就是我在 sql 查询中添加的原因,按 my_field3 desc 排序

以上是关于Coredata groupby 属性 iOS的主要内容,如果未能解决你的问题,请参考以下文章

用于 groupby 和 count 组合的 NSFetchRequest

Python、Pandas:GroupBy 属性文档

CoreData 关系与属性

CoreData派生属性查看一对多关系是不是包含属性

添加新属性时,CoreData 无法完成错误

为啥更改实体的属性时会删除我的 CoreData 信息?