5

我一直在互联网上寻找这个答案,但到目前为止还没有运气。所以我需要咨询这里聪明又善良的人。这是我第一次在这里提问,所以我希望我做对了,不要重复这个问题。

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

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

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

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

这行不通,因为它正在做相反的事情:

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

谢谢大家!

4

2 回答 2

4

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

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

此解决方案已经过测试,可以与您的示例一起使用。

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托管对象的属性名称。

于 2012-06-08T08:34:47.887 回答
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”是实体“Expense”的一个属性。这仅正确检索“desc”是“ABCDEF”子字符串的行。

于 2012-06-08T01:11:27.467 回答