1

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

+-------+-----+---------+
| 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 的最大 uid)、34567(id-2 category-1 的最大 uid)、56789( id-2 category-2 的最大 uid)

使用原始 SQL,我可以执行以下操作:

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

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

4

1 回答 1

0

根据其他答案(例如 Martin R 指出的答案),我将其分为两部分。首先,使用带有 NSDictionaryResultType 的 fetch 请求来获取所有最大 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 数组使用以下谓词获取相应的 NSManagedObjects:

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

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

于 2013-03-29T03:43:13.603 回答