如何使用谓词从核心数据中获取偶数和奇数值
How to fetch even and odd values from core data using Predicate
我想从我的核心数据实体中获取偶数和奇数值,请查看下面的代码并更正,因为它会使应用程序崩溃。
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。
不支持谓词中的这种数学。
解决方法:
在 NSManagedObject
子类
中创建布尔计算 属性 isEven
- (BOOL)isEven
{
return self.street % 2 == 0
}
并在谓词中使用格式 isEven == TRUE
或 isEven == FALSE
。
predicate = [NSPredicate predicateWithFormat:@"isEven == TRUE)"];
您可以直接在 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
实际上并不需要之后变得更简单。
我想从我的核心数据实体中获取偶数和奇数值,请查看下面的代码并更正,因为它会使应用程序崩溃。
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。
不支持谓词中的这种数学。
解决方法:
在 NSManagedObject
子类
isEven
- (BOOL)isEven
{
return self.street % 2 == 0
}
并在谓词中使用格式 isEven == TRUE
或 isEven == FALSE
。
predicate = [NSPredicate predicateWithFormat:@"isEven == TRUE)"];
您可以直接在 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
实际上并不需要之后变得更简单。