如何为这种请求创建正确的 NSPredicate?
Posted
技术标签:
【中文标题】如何为这种请求创建正确的 NSPredicate?【英文标题】:How do I create the right NSPredicate for this kind of request? 【发布时间】:2010-08-20 15:21:27 【问题描述】:您好,问题是这样的:
我在 CoreData 中拥有具有标题和与关键字实体的关系的实体。
我需要一个谓词来帮助我获取标题中包含我键入的关键字的所有实体。我有下面的代码应该这样做,但它没有:
NSArray *keywords = [searchString componentsSeparatedByString:@" "];
NSString *predicateString = @"";
for(NSInteger i = 0; i < [keywords count]; i++)
if(((NSString*)[keywords objectAtIndex:i]).length != 0)
if(i==0)
predicateString = [keywords objectAtIndex:i];
else
predicateString = [predicateString stringByAppendingFormat:@" and keywords.normalizedKeyword contains[cd] %@", [keywords objectAtIndex:i]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"keywords.normalizedKeyword contains[cd] %@",predicateString];
例如,我的实体标题如下:
1) “伟大的着色主题” 2)“儿童主题” 3) “儿童汽车”
我的关键字数据库将包含:
太棒了 染色 主题 为了 孩子们 汽车
我怎样才能创建一个谓词,所以当我输入例如:
主题
结果将是 2) 和 3)
或者如果我输入:
很棒的主题
结果将是 1) 和 2)
非常感谢任何帮助获得正确的谓词来实现这一点。我在那里尝试做的事情不起作用,而且我没有想法。
谢谢!
【问题讨论】:
铸造是不必要的。-objectAtIndex:
返回一个 id
。 id
无所不能,所以演员阵容是不必要的,而且是在 Objective-C 中养成的一个可怕的习惯。
您的for
循环也不是必需的。 Objective-C 具有快速枚举,因此您可以将其重写为 for (NSString *predicateString in keywords)
并完成很多逻辑。
【参考方案1】:
我自己找到了答案。要解决这样的问题,您必须使用 NSCompoundPredicate。 我的问题的解决方案是这样的:
NSArray *keywords = [lowerBound componentsSeparatedByString:@" "];
NSMutableArray *predicates = nil;
for(NSInteger i = 0; i < [keywords count]; i++)
if(((NSString*)[keywords objectAtIndex:i]).length != 0)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"keywords.normalizedKeyword contains[cd] %@", [keywords objectAtIndex:i]];
if(predicates == nil)
predicates = [[NSMutableArray alloc] initWithCapacity:0];
[predicates addObject:predicate];
NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
【讨论】:
以上是关于如何为这种请求创建正确的 NSPredicate?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 CoreData 中包含 NSArray 的二进制数据创建 NSPredicate?
如何为 NSPredicate 连接两个字符串,即名字和姓氏
如何为 CoreData 多对多关系编写 NSPredicate
SQLAlchemy + Tornado:如何为SQLAlchemy的ScopedSession创建scopefunc?