核心数据:分组和计数结果返回空列表

Posted

技术标签:

【中文标题】核心数据:分组和计数结果返回空列表【英文标题】:Core Data: Group by and count results returns empty list 【发布时间】:2014-02-08 20:04:33 【问题描述】:

考虑以下核心数据实体:

Person - personId:NSNumber,name:NSString,position:NSString

使用 Core Data,我正在尝试复制以下 SQL 查询:

SELECT `position`, COUNT(*) FROM `Person` GROUP BY `position`

下面是objective-c的等价物:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person"]

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];

NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"position"];
NSExpression *countExpression = [NSExpression expressionForFunction:@"count:" arguments:@[keyPathExpression]];

NSAttributeDescription *positionDescription = [entity.attributesByName objectForKey:@"position"];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];

[expressionDescription setName:@"count"];
[expressionDescription setExpression:countExpression];
[expressionDescription setExpressionResultType:NSInteger32AttributeType];

[request setPropertiesToFetch:@[positionDescription, expressionDescription]];
[request setPropertiesToGroupBy:@[positionDescription]];
[request setResultType: NSDictionaryResultType];

NSError *error = nil;
NSArray *results = [context executeFetchRequest: request error: &error];

Person 实体肯定是填充的,但是,在执行上述代码时,results 数组是空的。想法?

【问题讨论】:

你得到一个空数组还是nil?如果你得到 nil,那么错误变量应该包含一些信息。 在执行请求之前您是否保存对象?带有 NSDictionaryResultType 的 fetch 请求仅返回存储文件中的对象。 - 如果省略 setPropertiesToGroupBy 会得到结果吗? 对象肯定被保存了。 我刚刚用您的代码运行了一个小型测试应用程序,它运行并产生了预期的结果。 看起来就是这样。在使用 MagicalRecord 和 CoreData 时,我没有执行 MR_saveToPersistentStoreAndWait],而是使用 [NSManagedObjectContext save:] 操作。此外,我不知道使用 NSDictionaryResultType 的提取请求仅返回存储文件中的数据。谢谢@MartinR! 【参考方案1】:

(来自我上面的 cmets:)带有 NSDictionaryResultType 的 fetch 请求仅返回存储文件中的对象,而不是挂起的更改。因此,您必须在执行该获取请求之前将上下文保存到持久存储中。

【讨论】:

你能给我或指出一个例子,我可以得到按特定属性分组的所有实体吗?

以上是关于核心数据:分组和计数结果返回空列表的主要内容,如果未能解决你的问题,请参考以下文章

返回peewee ORM中分组项目的计数

核心数据 - 分组

SAS中如何分组计数,并将值保存到宏变量

使用 nHibernate 分组和计数

按月分组计数

Oracle数据库—— 分组函数