gpt4 book ai didi

cocoa - 具有不同值和表达式的 NSFetchRequest

转载 作者:行者123 更新时间:2023-12-03 16:48:41 26 4
gpt4 key购买 nike

我必须为我的 iPhone 应用程序创建一个 NSFetchRequest,它返回与以下 SQL 语句相同的结果:

SELECT week
, year
, SUM(duration) AS totalDuration
FROM myTable
GROUP BY year
, week

我尝试使用以下代码解决该问题:

NSExpression * durationExpression = [NSExpression expressionForFunction:@"sum:" arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:@"duration"]]];
NSExpressionDescription * durationExpressionDescription = [[[NSExpressionDescription alloc] init] autorelease];
[durationExpressionDescription setExpression:durationExpression];
[durationExpressionDescription setExpressionResultType:NSDoubleAttributeType];
[durationExpressionDescription setName:@"totalDuration"];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:managedObjectContext];
NSArray *propertiesToFetch = [[NSArray alloc] initWithObjects:@"year", @"week", durationExpressionDescription, nil];

[fetchRequest setEntity:entity];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:propertiesToFetch];

但这会将所有结果分组到一行。有什么解决办法吗?

编辑:源表具有以下数据:

year | month | duration
2011 | 7 | 10
2011 | 7 | 15
2011 | 6 | 15
2011 | 5 | 10

SQL 语句返回我想要实现的正确结果:

year | month | duration
2011 | 7 | 25
2011 | 6 | 15
2011 | 5 | 10

NSFetchRequest 返回:

year | month | duration
2011 | 7 | 50

最佳答案

很确定您的单个返回是由 NSExpression 触发的,它只能返回单个值。否则,你会得到一个像这样的字典数组:

year | month | duration
2011 | 7 | 50
2011 | 6 | 50
2011 | 5 | 50

...这实际上并不能反射(reflect)数据的状态。

该表达式配置为返回给定的每个 MyEntity 实例中的所有 duration 值的总和。由于您没有获取谓词,因此将为上下文提供可用的 MyEntity 的每个现有实例。然而,它只能返回单个值,这意味着按属性获取时只有一个字典。

对此的最佳解决方案是仅为表达式创建单独的提取,因为它实际上与提取的其他值无关,即求和值不与任何特定年份或月份值关联。在任何情况下,简单的提取运行得更快,因此将表达式分开将给您带来整体速度提升,即使您有两次而不是一次提取。

我会提醒您避免像使用 SQL 那样尝试使用 Core Data。将 Core Data 视为 SQL 包装器是一个严重错误。核心数据不是 SQL。实体不是表。对象不是行。属性不是列。关系不是连接。 Core Data 是一个对象图管理系统,它可能会也可能不会持久化对象图,并且可能会也可能不会在幕后使用 SQL 来执行此操作。令人惊讶的是,直接从 SQL 转换为核心数据的东西很少。

关于cocoa - 具有不同值和表达式的 NSFetchRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6681565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com