NSPredicate 和BeginsWith

Posted

技术标签:

【中文标题】NSPredicate 和BeginsWith【英文标题】:NSPredicate and BeginsWith 【发布时间】:2012-11-11 22:34:21 【问题描述】:

我想弄清楚 NSPredicate 将在我的核心数据中搜索以下开头的单词:

例如: 核心数据中的描述字段有这样的文字:

My name is Mike
My name is Moe
My name is Peter
My name is George

如果我搜索“我的名字是”,我需要得到 3 行 如果我搜索“我的名字是 M”,我需要获取前 2 行

我尝试了下面的代码,但无法得到我需要的东西。我猜我需要一个正则表达式,但不知道该怎么做。

[NSPredicate predicateWithFormat:@"desc beginswith [cd] %@",word];

【问题讨论】:

谓词没问题。真正的问题是什么? 好吧,我如何在输入时一次比较每个单词?如果我输入'My',它需要找到以任何单词开头或匹配'My'的字符串,然后当我输入第二个单词'name'时,它需要找到'My'并且任何单词以'name'开头等等第四次? 比你应该建立一些方法来给你这个结果。也许您可以拆分您输入的字符串并在谓词对象中使用它们?我会更新我的答案。 【参考方案1】:

我最近就是这样做的,效果很好。试试看。我看到我没有[cd]beginswith,而是contains。你可以试试看。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains %@", textField.text];
NSArray *list = [allWords filteredArrayUsingPredicate:predicate];

for(NSString *word in list)
    NSLog(@"%@",word);

看完首发上的cmets:

首先,您应该将字符串中的单词与文本字段分开:

NSArray *myWords = [textField.text componentsSeparatedByString:@" "];

然后像你第一次那样做:

for(NSString *wordFromTextField in myWords)
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains %@", wordFromTextField];
    NSArray *list = [allWords filteredArrayUsingPredicate:predicate];

    for(NSString *word in list)
        NSLog(@"%@",word);
    

您当然可以将它们添加到数组中,而不是 NSLogging。

【讨论】:

谢谢。我已经把它分开了。我在做 NSPredicate predicateWithFormat:@"desc 以 [cd]%@ AND desc 开始于 [cd]%@ AND ...",words[0],words[1],words[2]..]。它只适用于数组中的第一个单词,它在点击空格并输入更多单词后停止。我不确定如何通过一次获取请求来完成您的数组循环? 我按照您的建议解决了这个问题。我使用了 NSCompoundPredicate。 NSMutableArray *subpredicates = [NSMutableArray 数组]; for(NSString *token in words) NSPredicate *pred = [NSPredicate predicateWithFormat:@"ColumnName contains[cd] %@",token]; [子谓词 addObject:pred]; req.predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];我会接受你的回答,因为你引导我找到了正确的解决方案。

以上是关于NSPredicate 和BeginsWith的主要内容,如果未能解决你的问题,请参考以下文章

获取的属性和 NSPredicate

NSPredicate 和过滤

NSPredicate 同时使用 IN 和 LIKE

NSPredicate 和 NSRegularExpression

NSPredicate 用于多个对象和属性

为啥 NSPredicate 和 DateComponents 不起作用