NSPredicate == 查询

Posted

技术标签:

【中文标题】NSPredicate == 查询【英文标题】:NSPredicate == query 【发布时间】:2011-05-27 12:37:56 【问题描述】:

我正在尝试使用 nspredicate 来查找一个托管对象,其属性值 == 到我要检查的值。

我确定该值在我的数据模型中。

这是我迄今为止尝试过的,但结果数组计数始终为零。

-(BOOL)checkIfFavouriteExists:(NSString *)data

    BOOL returnvalue;

    NSFetchRequest *fetchReq = [[NSFetchRequest alloc]init];

    NSString *attributeName = @"userid";
    NSString *attributeValue = data;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == '%@'",
                              attributeName, attributeValue];

    //setting the predicate to the fetch request 
    [fetchReq setPredicate:predicate];

    [fetchReq setEntity:[NSEntityDescription entityForName:@"Favourites" inManagedObjectContext:self.managedObjectContext]];

    NSMutableArray *resultArray = [[NSMutableArray alloc]initWithArray:[self.managedObjectContext executeFetchRequest:fetchReq error:nil]];

    if([resultArray count]>0)
    
        returnvalue=YES;

        else
    
        NSLog(@"No records");
        returnvalue=NO;
     

    return returnvalue;

编辑

问题似乎与我的查询格式有关。

这行得通吗?

NSExpression *exprName = [NSExpression expressionForKeyPath:@"userid"];
NSExpression *exprVal = [NSExpression expressionForConstantValue:data];
NSPredicate *predicate = [NSComparisonPredicate predicateWithLeftExpression:exprName
                                                            rightExpression:exprVal 
                                                                   modifier:NSDirectPredicateModifier 
                                                                       type:NSEqualToPredicateOperatorType 
                                                                    options:0];

我不明白为什么一个有效而另一个无效。他们都做同样的事情对吗?

【问题讨论】:

您是否尝试从 -executeFetchRequest:error: 中捕获错误? 你尝试过在谓词格式中使用单个= 吗? 试试这个,[NSPredicate predicateWithFormat:@"%@ = %@", attributeName, attributeValue]; @SImon,我找到了解决方案,但我也会试试你的 :) 【参考方案1】:

不要将变量放在引号中。 documentation on Parser Basics 声明:

单引号或双引号变量(或 替换变量字符串)原因 要解释的 %@、%K 或 $variable 作为格式字符串中的文字和 所以防止任何替代。

应该这样做:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userid == %@", attributeValue];

您可以在Predicate Programming Guide 中阅读有关谓词的更多信息。

【讨论】:

以上是关于NSPredicate == 查询的主要内容,如果未能解决你的问题,请参考以下文章

Objective-c NSPredicate - 按不同 NSManagedObjectContext 中的 ObjectId 过滤

创建一个带有换行符的 NSPredicate 作为字符串的一部分

按核心数据中的日期组件获取条目

过滤自定义对象的 NSMutable 数组

子查询中的 NSPredicate

NSPredicate == 查询