Как подсчитать количество дочерних объектов с определенным значением? - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть 2 сущности в отношении ко-многим, Родитель -> Ребенок. Дочерняя сущность имеет логический атрибут, который может быть ИСТИНА или ЛОЖЬ.

Я могу легко посчитать, сколько дочерних сущностей существует с [parent.child count], что возвращает мне хорошее целое число.

Но что, если я только хочу посчитать дочерние сущности, которые ИСТИНА? Есть ли простой способ сделать это?


EDIT

Я пытался реализовать предикатный выбор @ unforgiven, но я получаю ошибку «невозможно разобрать строку формата» - это код, который я пытаюсь (где Checklist - родительская сущность, ChecklistItem является дочерней сущностью, а checked является логическим значением для ChecklistItem):

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    Checklist *aChecklist = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = aChecklist.name;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Checklist" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(checklistItem, $sub, $sub.checked == %@).@count", [NSNumber numberWithBool:YES]];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

    cell.detailTextLabel.text = [NSString stringWithFormat:@"%i items ticked", [results count]];
    [fetchRequest release];
}

Если я заменим предикат на any self.checklistItems.checked = %@, приложение не аварийно завершит работу, но возвращенное число будет равно общее количество контрольных списков, для которых проверен любой ChecklistItem , что, очевидно, означает, что оно возвращает то же число за каждый контрольный список.

Ответы [ 4 ]

2 голосов
/ 08 апреля 2011

Попробуйте получить подмножество только проверенных объектов

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"checked = YES"]
NSSet *checkedChildren = [parent.children filteredSetUsingPredicate:filterPredicate];
NSUInteger count = [checkedChildren count];

Не проверял это дважды перед тем, как писать сегодня, но я неоднократно писал подобный код.

Для ясности разнесены на три строки.

0 голосов
/ 17 апреля 2014

Несколько лет спустя это теперь простой способ сделать это.

Вы можете использовать оператор @sum collection для простого подсчета объектов в коллекции с помощью YES BOOLзначение.

[parent valueForKeyPath:@"children.@sum.checked"];

0 голосов
/ 08 апреля 2011

Я придумал альтернативный способ сделать это.Я просто добавил целочисленный атрибут с именем «numberChecked» в родительскую сущность («Контрольный список»), и каждый раз, когда ChecklistItem отмечен или не отмечен, я добавляю или удаляю один из numberChecked.работает отлично, но мне все равно было бы интересно узнать, может ли кто-нибудь придумать способ сделать это без необходимости явно добавлять его в мою модель данных.

0 голосов
/ 06 апреля 2011

Вам необходимо использовать подзапрос в Core data.Предполагая, что дочерняя сущность имеет логический атрибут booleanAttribute, вам необходимо извлечь объекты из родительской сущности, используя нечто похожее на следующий предикат:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...