使用@max谓词获取唯一的核心数据实体

时间:2013-03-28 16:13:38

标签: ios objective-c core-data ios6 nsfetchedresultscontroller

我有一个核心数据结构如下:

+-------+-----+---------+
| uid   | id  | category
+-------+-----+---------+
| 12345 |  1  | 1
| 23456 |  1  | 1
| 34567 |  2  | 1
| 45678 |  2  | 2
| 56789 |  2  | 2
+-------+-----+---------+

是否可以查询数据,以便返回具有唯一ID /类别组合的NSManagedObjects(不是字典)?使用上面的示例表,我想要一个包含具有以下uid的对象的数组:23456(id-1 category-1的max uid),34567(id-2 category-1的max uid),56789( id-2 category-2的max uid

使用原始SQL我可以使用以下内容执行此操作:

SELECT MAX(uid), id, category FROM TABLE GROUP BY id, category

是否可以将上述SQL转换为NSFetchRequest?

1 个答案:

答案 0 :(得分:0)

根据其他答案(例如Martin R指出的答案),我将其分为两部分。首先,使用带有NSDictionaryResultType的获取请求来获取所有最大的uid:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context];
[request setEntity:entity];

NSExpression *expr = [NSExpression expressionForKeyPath:@"uid"];
NSExpression *maxExpr = [NSExpression expressionForFunction:@"max:" arguments:@[expr]];
NSExpressionDescription *exprDesc = [[NSExpressionDescription alloc] init];
[exprDesc setExpression:maxExpr];
[exprDesc setName:@"uid"];

NSPropertyDescription *id = [[entity propertiesByName] objectForKey:@"id"];
NSPropertyDescription *cat = [[entity propertiesByName] objectForKey:@"category"];

[request setPropertiesToGroupBy:[NSArray arrayWithObjects:id, cat, nil]];
[request setPropertiesToFetch:[NSArray arrayWithObjects:exprDesc, nil]];
[request setResultType:NSDictionaryResultType];

NSArray *result = [context executeFetchRequest:request error:nil];
NSArray *maxUids = [result valueForKeyPath:@"uid"];

其次,使用maxUids数组使用以下谓词获取相应的NSManagedObject:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(uid IN %@)", maxUids];

使用两个获取请求并不理想,但提供了使用SUBQUERY和/或更改基础数据模型的替代方法。