2013-03-28 60 views
1

我有一個核心數據結構就像如下:獲取獨特的核心數據實體@Max謂詞

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

是否可以查詢數據,使得我返回NSManagedObjects(非字典)具有獨特的ID /類別組合?使用上面的示例表,我想有一個包含具有以下uid的對象的數組:23456(id-1 category-1的最大uid),34567(id-2 category-1的max uid),56789(最大UID爲ID-2類-2)

有了原始的SQL我可以用下面這樣做:

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

是否可以翻譯上面的SQL到NSFetchRequest?

+2

你有看看http://stackoverflow.com/questions/3197141/core-data-predicate-with-group-and-max? –

回答

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陣列使用下面的謂詞來獲取相應的NSManagedObjects:

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

使用兩個取請求並不理想,但提供了使用SUBQUERY和/或更改底層數據模型的替代方法。