2016-03-08 2 views
1

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

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

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

Допустим, продукт база данных 14 х 14см и процент ошибок составляет 10% (1.4cm), то вы ищете продукт, который 15 х 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, но должны быть написаны в соответствии с документация по этой ссылке: Documentation

Ниже мой 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]; 

} 

ответ

1

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

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"divide:by:(multiply:by:(height,percErro),100) <= %@ AND divide:by:(multiply:by:(width,percErro),100) <= %@",heightInserted, widthInserted]; 
+0

Спасибо за ваш ответ, я пытался использовать операторы NSExpression указанных путей, однако, кажется, что не работает, они будут работать, если прямой добавлен в [NSPredicate predicateWithFormat : @ "..."]; как я это сделал? – jucajl

+0

Можете ли вы отредактировать свой пост, чтобы показать, что вы пробовали, и какие ошибки/результаты вы получили? Благодарю. – pbasdf

+0

Я обновил сообщение и добавил свой полный метод – jucajl

Смежные вопросы