【问题标题】:A reverse kind of string compare using NSPredicate使用 NSPredicate 进行反向字符串比较
【发布时间】:2012-06-12 02:20:44
【问题描述】:

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

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

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

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

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

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

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

谢谢大家!

【问题讨论】:

    标签: objective-c ios core-data nspredicate


    【解决方案1】:

    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 属性的名称。

    【讨论】:

    • 哇,这是先进的东西。谢谢它的作品!现在我得试着理解它是如何在这里工作的。再次感谢!
    • @Mundi,我不确定您所说的“反向包含”是什么意思不起作用。我在答案中提供的谓词确实有效,我已经更新了我的答案以显示将谓词与核心数据一起使用的代码。
    • 我尝试了您的版本,但没有正确检索子字符串匹配项。显然,那是在您进行编辑之前。在您编辑之后,我可以编辑我的答案等。ad infinitum。无论如何,谢谢您的纠正。
    • 现在我尝试了您的新版本 - 它仍然无法正常工作。 ('NSInvalidArgumentException',原因:'-[__NSCFConstantString countByEnumeratingWithState:objects:count:]:无法识别的选择器发送到实例)。对不起。
    • 仔细观察后,这个解决方案接近我正在寻找的,但不完全是。通过这种将字符串转换为例如@"A?B?C?D?E?F?" 的解决方案将匹配 ABC,EF,...(这就是我想要的)没问题。但它也会匹配 ABD(忽略 C)——这不是我想要的。简而言之,我想匹配存储在 Core Data 中的所有有效记录,这些记录是提供的超级字符串的子字符串。任何想法如何使用谓词来完成?谢谢!
    【解决方案2】:

    我认为这会奏效:

    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”子字符串的行。

    【讨论】:

    • @Kjuly,不管是大写还是小写。
    • 是的,但我想对保留字使用大写。 ;)
    • 感谢您的回复。我之前也尝试过“包含”。似乎第一个标记不能是字符串。如果我这样做,代码似乎甚至都不会执行。但是当我有机会时,我会再试一次。顺便说一句,保留词 SELF 代表什么?谢谢。
    • 另一个后续问题是“LIKE”到底是做什么的?我尝试执行以下操作,似乎 LIKE 正在进行精确的字符串比较: "ABC" LIKE "ABC" -> TRUE "ABCD" LIKE "ABC" -> FALSE "ABC" LIKE "ABCD" -> FALSE 感谢您的配合新手问题
    • SELF 表示将传递给谓词的对象——因此,如果您使用谓词过滤数组(使用filteredArrayUsingPredicate:) SELF 将是数组中的每个对象。 LIKE 表示左侧表达式等于右侧表达式,但您可以包含通配符以扩大范围。查看 Apple 的谓词编程指南。
    猜你喜欢
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多