我有一个核心数据结构如下:
+-------+-----+---------+
| 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?
答案 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和/或更改基础数据模型的替代方法。