NSExpressionDescription для пустых наборов результатов - PullRequest
3 голосов
/ 31 августа 2011

Используя Core Data, у меня есть запрос на выборку для получения минимума определенного атрибута с помощью выражения.Если я устанавливаю предикат для запроса, который не приводит ни к каким результатам, я получаю EXC_BAD_ACCESS.Это имеет некоторый смысл, поскольку вы не можете добавить nil в NSArray для результатов, но как лучше всего обойти это?

Я могу просто использовать порядок сортировки и предел выборки 1, но этоВ API NSExpressionDescription немного упускается из виду то, что нет способа вернуть результат по умолчанию или вернуть пустой массив, если ни один объект не был сопоставлен до вычисления выражения., используемый в setPropertiesToFetch для запроса на выборку, должен уже вести себя разумно для этой ситуации?

Ответы [ 2 ]

4 голосов
/ 25 февраля 2013

Сегодня столкнулся с подобной ситуацией. Установите свой NSFetchRequest resultType равным NSDictionaryResultType.

- (NSDate *)maxDateForEvent:(Event *)event withContext:(NSManagedContext *)context
{

    NSExpression *modifiedDateExpression = [NSExpression expressionForKeyPath:@"modifiedDate"];
    NSExpression *maxExpression = [NSExpression expressionForFunction:@"max:"
                                                              arguments:[NSArray arrayWithObject:modifiedDateExpression]];

    NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
    [expressionDescription setName:@"maxDate"];
    [expressionDescription setExpression:maxExpression];
    [expressionDescription setExpressionResultType:NSDateAttributeType];

    NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
    fetch.entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];
    fetch.propertiesToFetch = [NSArray arrayWithObject:expressionDescription];
    fetch.resultType = NSDictionaryResultType;
    fetch.predicate = [NSPredicate predicateWithFormat:@"event == %@", event];
    NSError *error;
    NSArray *array = [context executeFetchRequest:fetch error:&error];
    if (!array || ![array count]) {
        return [NSDate distantPast];
    }

    NSDate *date = [[array lastObject] objectForKey:@"maxDate"];
    if (!date) {
        return [NSDate distantPast];
    }

    return date;
}
0 голосов
/ 07 февраля 2012

Обходной путь во втором абзаце - это то, что мне пришлось использовать, так что, похоже, это просто недосмотр API.

...