NSPredicate 使用 OR 错误

Posted

技术标签:

【中文标题】NSPredicate 使用 OR 错误【英文标题】:NSPredicate using OR error 【发布时间】:2013-01-02 07:02:51 【问题描述】:

第一次构建NSPredicate

我想使用以下逻辑搜索managedobjectcontext

Search for a, grab all matches
Search for b, grab all matches, etc....

Nsarray *results = (has all a results, b results, etc);

我尝试的谓词是:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name== %@ OR name == %@ OR name == %@",a,b,c];

但是我得到了这个predicate的错误...

已编辑:我编写的示例方法

-(NSPredicate*)parsePartsIntoAPredicate:(NSMutableArray*)inputPartsNames
    NSSet *keys=[NSSet setWithArray:inputPartsNames];
    NSPredicate *predicate=[NSPredicate predicateWithFormat:@"any self.@name in %@", keys];
    NSLog(@"predicate = %@",predicate);
    return predicate;

澄清:我有一个汽车数据库(20,000 辆)每辆汽车都有多个零件。我想找到所有具有 a 部分的汽车,所有具有 b 部分的汽车,以及所有具有 c 部分的汽车。然后我想返回一个包含 a、b、c 等部分的汽车的数组......

如果您认为有更好的方法,请告诉我,但我正在倒退。我说的是

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Cars" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];
    [fetchRequest setPredicate:[self parsePartsIntoAPredicate:inputParts]];

    NSError *error;
    NSArray *records = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];

我做错了什么?

【问题讨论】:

你的问题一点都不清楚,看看这个问题看看第一个答案NSPredicate 'OR' filtering based on an NSArray of keys 并尝试在你的代码中使用它 你得到什么错误?可能是错字,但“NSpredicate”中的“p”应该是大写。 尽量把它说得更清楚,在没有太多信息的情况下提供帮助有点冒险! 要获得有用的答案,您必须至少显示:1) 托管对象实体的定义,2) 准确的谓词和获取请求(复制/粘贴没有拼写错误!),3) 准确的错误信息。 你得到什么错误? nameCars 实体的属性吗?在这种情况下,请尝试[NSPredicate predicateWithFormat:@"name IN %@", keys] 【参考方案1】:
NSString *key;
NSMutableArray *tempArray;
NSPredicate *searchForName = [NSPredicate predicateWithFormat:@"name = %@", key];
NSArray *filterArray = [tempArray filteredArrayUsingPredicate:searchForName];
NSLog(@"%@",filterArray);

key 是您的搜索关键字,tempArray 是您的 CompleteArray,其中存在数据。

像这样使用。请输入您的数据。

【讨论】:

对现有数组进行排序或将谓词放入获取请求中是否更快?所以本质上,我会问所有汽车的coredata,然后一一找到与每个部分匹配的汽车吗?【参考方案2】:

使用这个

NSPredicate* predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@ '%@'", @"SELF contains[c] ",searchText]];

【讨论】:

输入必须是可变的......它可以是 2 个变量,也可以是 100。这也会做 OR 吗?所以找到所有有a的,找到所有有b的,找到所有有c的,等等......【参考方案3】:

要获取所有具有nameCars 对象,keys 集合或数组中的字符串之一,请使用

[NSPredicate predicateWithFormat:@"name IN %@", keys]

【讨论】:

以上是关于NSPredicate 使用 OR 错误的主要内容,如果未能解决你的问题,请参考以下文章

CoreData:NSPredicate 按日期过滤

NSPredicate 获取具有 NSDate 日期范围内的日期属性的核心数据对象

NSPredicate:与日期iOS的to-Many关系

过滤巨大的 NSArray

按记录名称获取多条记录

为啥我收到“无法解析 NSPredicate”错误