使用 NSPredicate Core Data 中的数据库字段执行计算

Posted

技术标签:

【中文标题】使用 NSPredicate Core Data 中的数据库字段执行计算【英文标题】:Perform calculations with fields of database in NSPredicate Core Data 【发布时间】:2016-03-08 16:40:58 【问题描述】:

我创建了一种从我的数据库中恢复产品的方法,每个项目都有字段高度、宽度和 percErro(百分比错误),

用户输入要搜索的宽度和高度,例如:15 x 15cm

那么该方法应该带来具有这些编号的兼容产品,同时考虑到其注册中允许的错误百分比。

假设产品是数据库是 14 x 14cm,错误百分比是 10% (1.4cm),那么你搜索的产品是 15 x 15cm

在我的查询中,我必须这样做:

[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 可以从比较的双方中剔除)。但是您的最后陈述是错误的:在谓词中使用(基本)数学计算是可能的。正确的语法在documentation for NSExpression 中。在您的情况下,您将需要这样的东西:

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

【讨论】:

感谢您的回复,我尝试使用提到的方式使用 NSExpression 运算符,但是似乎不起作用,如果直接添加到 [NSPredicate predicateWithFormat: @"..."] 中它们会起作用吗;像我做的那样? 您能否编辑您的帖子以显示您尝试过的内容以及遇到的错误/结果?谢谢。 @jucajl 谢谢。我认为您使用的“公式”可能是错误的(它相当于“searchHeight >= height AND (searchHeight * percErro) 假设用户输入高度值:8.0 宽度:15,假设所有产品的 percErro 为 0.05,则查询将如下所示 "8.0 >= databaseHeight AND (8.0 * 0.05) @jucajl 对不起,如果我很迟钝,但我还是不明白你的搜索条件。使用您的示例值,第一个子句 ("8.0 >= 8.5") 是错误的。但我认为我们可能需要太多的 cmets:你想在聊天中讨论它吗?

以上是关于使用 NSPredicate Core Data 中的数据库字段执行计算的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 遍历多个 Core Data 对象

iPhone如何使用NSPredicate按父实体过滤Core Data?

ios 如何正确使用 NSPredicate 来匹配 Core Data 的 NSString?

Core Data 中的 URI 类型属性:如何使用 NSPredicate 进行查询

Core Data 使用类似于 BEGINSWITH 的东西为 NSNumber 创建 NSPredicate

Core Data NSPredicate 过滤结果