Выполнение расчетов с полями базы данных в NSPredicate Core Data

Я создаю метод для восстановления продукта из моей базы данных, каждый элемент имеет поля высоты, ширины и percErro (процентная ошибка),

Пользователь вводит ширину и высоту, которые вы хотите найти, например: 15 x 15 см.

Затем метод должен вывести совместимые товары с этими номерами с учетом процента погрешности, допускаемого при его регистрации.

Допустим, продукт в базе данных имеет размер 14 x 14 см, а процент ошибок составляет 10% (1,4 см), тогда вы ищете продукт размером 15 x 15 см.

В моем запросе я должен сделать что-то вроде этого:

[query appendString: [NSString stringWithFormat: @ "(heigthInserted * percErro / 1000) <= (height * percErro / 100)"

[query appendString: [NSString stringWithFormat: @ "AND (widthInserted * percErro / 1000) <= (width * percErro / 100)"

 NSPredicate * predicate = [NSPredicate predicateWithFormat: query];
    [Request setPredicate: predicate];

Это должно принести мне все товары, процент погрешности которых не превышает 10% (1,4 см)

Я знаю, что NSPredicate не принимает математические операции, как я могу получить результат, вычислив этот процент ошибки?

**

Решено

**

Я принял ответ pbasdf и пришел к выводу, что математические операторы работают в NSPredicate, но должны быть написаны в соответствии с документацией по этой ссылке: Документация

Ниже мой 100% функциональный метод с операторами:

-(NSMutableArray*)findWithDimensoes:(NSMutableArray*)formatos :(float)largura :(float)altura{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:TABLE_NAME inManagedObjectContext:managedObjectContext]];

    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"altura" ascending:YES];
    NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"largura" ascending:YES];

    NSArray *arraySD = [NSArray arrayWithObjects:sortDescriptor1,sortDescriptor2,nil];
    [request setSortDescriptors:arraySD];
    [request setFetchLimit:20];

    NSMutableString *query = [[NSMutableString alloc] init];

    [query appendString:[NSString stringWithFormat:@" (habilitado == true) "]];

    if (formatos != nil) {
        for (ProdutoDimensao *d in formatos) {
            if ([d.id intValue] > 0) {
               if (([formatos indexOfObject:d] < formatos.count)) {
                    [query appendString:@" AND "];
                }

                [query appendString:[NSString stringWithFormat:@" (produtoDimensao.id == %d) ",[d.id intValue]]];
            }
        }
    }

    [query appendString:[NSString stringWithFormat:@" AND altura >=  from:subtract:(%lf,multiply:by:(%lf,percErro)) AND altura <= add:to:(%lf,multiply:by:(%lf,percErro)) ",altura,altura,altura,altura]];
[query appendString:[NSString stringWithFormat:@" AND largura >=  from:subtract:(%lf,multiply:by:(%lf,percErro)) AND largura <= add:to:(%lf,multiply:by:(%lf,percErro)) ",largura,largura,largura,largura]];


    NSPredicate *predicate = [NSPredicate predicateWithFormat:query];
    [request setPredicate:predicate];

    NSError *error = nil;
    NSArray *results = [managedObjectContext executeFetchRequest:request error:&error];


    return [results mutableCopy];

}

person jucajl    schedule 08.03.2016    source источник


Ответы (1)


Боюсь, я не понимаю ваши строки формата (например, percErro можно исключить из обеих сторон сравнения). Но ваше последнее утверждение неверно: можно использовать (основные) математические вычисления в предикатах. Правильный синтаксис приведен в документация для NSExpression. В вашем случае вам понадобится что-то вроде этого:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"divide:by:(multiply:by:(height,percErro),100) <= %@ AND divide:by:(multiply:by:(width,percErro),100) <= %@",heightInserted, widthInserted];
person pbasdf    schedule 08.03.2016
comment
Спасибо за ваш ответ, я пытался использовать операторы NSExpression указанным способом, однако, похоже, это не сработало, будут ли они работать, если они будут добавлены напрямую в [NSPredicate predicateWithFormat: @ ...]; как я сделал? - person jucajl; 09.03.2016
comment
Можете ли вы отредактировать свой пост, чтобы показать, что вы пробовали, и какие ошибки/результаты вы получили? Спасибо. - person pbasdf; 09.03.2016
comment
@jucajl Спасибо. Я думаю, что формула, которую вы используете, может быть неправильной (она эквивалентна searchHeight ›= height AND (searchHeight * percErro) ‹= (height * percErro), что будет верно, только если searchHeight == height. Можете ли вы объяснить, какие критерии вы хотите с чем сравнить? - person pbasdf; 09.03.2016
comment
Представьте, что пользователь вводит значения высоты: 8,0 ширина: 15, предположим, что percErro всех продуктов равен 0,05, тогда запрос будет выглядеть так: 8,0 ›= databaseHeight AND (8,0 * 0,05) ‹= (databaseheight * 0,05), у меня товар у которого 8.5 х 18.0, то поиск должен вернуть, а его нет. - person jucajl; 09.03.2016
comment
@jucajl Извините, если я туплю, но я все еще не понимаю ваших критериев поиска. С вашими примерными значениями первое предложение (8.0 ›= 8.5) ложно. Но я думаю, нам может понадобиться слишком много комментариев: не хотели бы вы обсудить это в чате? - person pbasdf; 09.03.2016
comment
Так что даже введя значение 8.6, запись не найдена, можем поговорить в чате, я им никогда не пользовался, так что не знаю как вам звонить, жду от вас связи. - person jucajl; 09.03.2016
comment
Давайте продолжим это обсуждение в чате. - person pbasdf; 09.03.2016
comment
Я решил кейс и скринил проблему с некорректной логикой, обновил вопрос и добавил решение, потом сделал вывод, что математические операторы работают в NSPredicate, но надо писать по документации по этой ссылке:developer.apple. com/library/mac/documentation/Cocoa/Reference/: - person jucajl; 09.03.2016
comment
@jucajl Спасибо - рад, что вы разобрались с логикой. - person pbasdf; 09.03.2016