【问题标题】:How to fetch even and odd values from core data using Predicate如何使用 Predicate 从核心数据中获取偶数和奇数
【发布时间】:2016-04-13 17:23:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios core-data nspredicate


    【解决方案1】:

    您可以直接在 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 之后变得更简单了。

    【讨论】:

    • 是的汤姆,你的回答也对,稍作修改后解决了我的问题,感谢您宝贵的时间和知识分享。
    • 为什么需要NSDictionaryResultType
    • ... 你可以把毛茸茸的语法短路:NSPredicate *evenOnly = [NSPredicate predicateWithFormat:@"modulus:by:(street,2) == 0"];
    • @MarcusS.Zarra 我猜不是。在我的第一个版本中,我为evenOddExpression 添加了NSExpressionDescription,并将其包含在propertiesToFetch 中。 确实需要字典结果,因为实体上不存在表达式。但后来我从propertiesToFetch 中删除了它,忘记了我不再需要字典结果类型了。答案已更新。
    【解决方案2】:

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

    解决方法:

    NSManagedObject 子类中创建一个布尔计算属性isEven

    - (BOOL)isEven
    {
       return self.street % 2 == 0
    }
    

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

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

    【讨论】:

    • 感谢 Vardian 的帮助。
    • 不正确。看我的回答。 :)
    猜你喜欢
    • 2016-12-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多