отчетливый счет - PullRequest
       12

отчетливый счет

0 голосов
/ 03 февраля 2011

Я хотел бы иметь базовые данные, эквивалентные функции 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 Ответ

1 голос
/ 03 февраля 2011

Модель данных, подразумеваемая образцами данных, предполагает, что вам придется извлекать каждый объект, фильтровать и повторно извлекать:

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 - это не реляционная база данных, это объектный граф, сохраняющий структуру.Если вы попытаетесь использовать его в качестве реляционной базы данных, вы окажетесь в беспорядке.

...