使用NSPredicate进行相反类型的字符串比较

时间:2012-06-08 00:48:04

标签: objective-c ios core-data nspredicate

我一直在网上搜索这个答案,但到目前为止还没有运气。所以我需要在这里咨询聪明善良的人。这是我第一次在这里问一个问题,所以我希望我这样做是正确的而不是重复这个问题。

对于我看到的所有示例,搜索字符串是存储在Core Data中的子字符串。另一方面,我想实现以下目标:

存储在核心数据中的字符串实际上是子字符串。我希望通过获取具有子字符串的所有核心数据行属于提供的搜索字符串来进行搜索。

对于前: 在核心数据中,我有“AB”,“BC”,“ABC”,“ABCDEF”,“GH”,“ABA” 在应用程序中我通过提供超级​​字符串进行搜索:“ABCDEF”,结果将返回“AB”,“BC”,“ABC”,“ABCDEF”但不是“GH”,“ABA”因为这两个子字符串不属于超级字符串。

我应该如何设置我的predicateWithFormat语句?

这不会起作用,因为它正在做相反的事情:

NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"substring LIKE[c] %@", @"ABCDEF"];

全部谢谢!

2 个答案:

答案 0 :(得分:4)

CONTAINS的反面不起作用。此外,您将无法使用LIKE,因为您必须获取正在搜索的属性并将其转换为通配符字符串。

可以使用MATCHES,因为您可以使用正则表达式。首先,通过在每个字母后添加*将搜索字符串转换为正则表达式。然后形成谓词。

此解决方案已经过测试,可用于您的示例。

NSString *string= @"ABCDEF";
NSMutableString *new = [NSMutableString string];
for (int i=0; i<string.length; i++) {
    [new appendFormat:@"%c*", [string characterAtIndex:i]]; 
}
// new is now @"A*B*C*D*E*F*";
fetchRequest.predicate = [NSPredicate predicateWithFormat:
                          @"stringAttribute matches %@", new];

其中谓词中的stringAttribute是您的托管对象的NSString属性的名称。

答案 1 :(得分:0)

我认为这会奏效:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%@ contains self",@"ABCDEF"];

您可以在核心数据中使用它:

-(IBAction)doFetch:(id)sender {
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    request.entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:self.managedObjectContext];
    request.predicate = [NSPredicate predicateWithFormat:@"%@ contains desc",@"ABCDEF"];
    NSArray *answer = [self.managedObjectContext executeFetchRequest:request error:nil];
    NSLog(@"%@",answer);
}

在此示例中,“desc”是实体“费用”的属性。这只能正确检索“desc”是“ABCDEF”的子字符串的行。