2011-02-03 3 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]; 

무엇을 추가해야합니까?

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]; 
} 

을 내가 데이터를 리모델링 좋을 것 : 샘플 데이터에 의해 암시

많은 감사

답변

1

데이터 모델을 사용하면 모든 객체, 필터를 가져올 거라고 및 페치 다시 제안합니다. species 속성을 Species 엔티티와의 관계로 바꿀 수 있습니다.

CoreData는 관계형 데이터베이스가 아니며, 객체 그래프 영구 프레임 워크입니다. 관계형 데이터베이스로 사용하려고하면 엉망이됩니다.

+0

답변 해 주셔서 감사합니다. 사실 나는 그런 알고리즘에 대해 생각해 봤지만 더 큰 데이터 세트에서는 그다지 빠르지는 않습니다. 어쩌면 나는 그것을 조율하려고 노력해야 하겠지만, 나는 한 가지 요청으로 모든 것을 얻는 것이 실제로 더 효율적이라고 생각했다. – lorenzo