2011-02-03 77 views
0

我想有SQL函数的核心数据等效的:重复计数

SELECT species, sex, COUNT(*) FROM Bird GROUP BY species, sex; 

请求指通常会以下输入返回此

+---------+------+----------+ 
| species | sex | COUNT(*) | 
+---------+------+----------+ 
| Bus  | m |  2 | 
| Car  | f |  1 | 
+---------+------+----------+ 

INSERT INTO Bird VALUES ('BlueBird','Car','f'); 
INSERT INTO Bird VALUES ('RedBird','Bus','m'); 
INSERT INTO Bird VALUES ('RedBird','Bus','m'); 

我已经完成了不同的请求,但我在计算(*)时遇到了问题。 以下是我有:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Bird" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 
[request setReturnsDistinctResults:YES]; 
[request setResultType:NSDictionaryResultType]; 
NSDictionary *entityProperties = [entity propertiesByName]; 

NSMutableArray *properties = [NSMutableArray arrayWithObject:[entityProperties objectForKey:@"species"]]; 
[properties addObject:[entityProperties objectForKey:@"sex"]]; 
[request setPropertiesToFetch: properties]; 

什么我要补充?

非常感谢

回答

1

的数据模型的样本数据暗示表明,你必须获取每个对象,过滤器和重新获取:

NSManagedObjectContext *moc; 
NSEntityDescription *birdEntity = [NSEntityDescription entityForName:"Bird" inManagedObjectContext:moc]; 

NSFetchRequest *fetchAllBirds = [[NSFetchRequest new] autorelease]; 
[fetchAllBirds setEntity:birdEntity]; 
NSArray *allBirds = [moc executeFetchRequest:fetchAllBirds error:NULL]; 

NSArray *species = [allBirds valueForKeyPath:@"@distinctUnionOfObjects.species"]; 

NSMutableDictionary *speciesCounts = [NSMutableDictionary dictionaryWithCapacity: [species count]]; 
for (NSString *speci in species) 
{ 
    NSFetchRequest *fetchSpeci = [[NSFetchRequest new] autorelease]; 
    [fetchSpeci setEntity: birdEntity]; 
    [fetchSpeci setPredicate:[NSPredicate predicateWithFormat:@"speci == %@", speci]]; 

    int speciCount = [moc countForFetchRequest:fetchSpeci]; 
    [speciesCounts setObject:[NSNumber numberWithInt:speciCount] forKey:speci]; 
} 

我建议重塑数据。您可以将species属性替换为与Species实体的关系。

CoreData不是一个关系数据库,它是一个对象图persistnts框架。如果您尝试将其用作关系数据库,您最终会陷入混乱。

+0

谢谢你的回答本笃。其实我已经考虑过这样的算法,但最终它在大型数据集上并不是很快。也许我应该试着微调它,但我认为在一个请求中获得所有内容会更有效率。 – lorenzo 2011-02-04 13:19:45