如何使用Predicate从核心数据中获取偶数和奇数值

时间:2016-04-13 17:23:34

标签: ios core-data nspredicate

我想从我的核心数据实体中获取偶数和奇数值,请查看下面的代码并更正,因为它会破坏应用程序。

        NSPredicate *predicate;
        if ([leadFilter.rank isEqualToString:@"Even"]) {
            predicate = [NSPredicate predicateWithFormat:@"(street%2) = 0"];
        }
        else
            predicate = [NSPredicate predicateWithFormat:@"street%2 != 0)"];
        [predicateArray addObject:predicate];

它的说法无法解析街道%2 = 0。

2 个答案:

答案 0 :(得分:8)

您可以直接在Core Data中执行此操作,但语法有点毛茸茸。要仅获取偶数的street值,请按以下方式设置您的提取:

NSExpression *evenOddExpression = [NSExpression expressionWithFormat:@"modulus:by:(%K,2)", @"street"];

NSFetchRequest *evenOddFetch = [NSFetchRequest fetchRequestWithEntityName:@"ENTITY_NAME"];

NSExpression *zeroExpression = [NSExpression expressionForConstantValue:@0];
NSPredicate *evenOnly = [NSComparisonPredicate predicateWithLeftExpression:evenOddExpression rightExpression:zeroExpression modifier:NSDirectPredicateModifier type:NSEqualToPredicateOperatorType options:0];
evenOddFetch.predicate = evenOnly;

结果将是任何一个托管对象的偶数值street

更新:在Marcus指出实际上并不需要NSDictionaryResultType之后,更简单了。

答案 1 :(得分:3)

不支持谓词中的这种数学。

解决方法:

isEven子类

中创建一个布尔计算属性NSManagedObject
- (BOOL)isEven
{
   return self.street % 2 == 0
}

并在谓词中使用格式isEven == TRUEisEven == FALSE

predicate = [NSPredicate predicateWithFormat:@"isEven == TRUE)"];