核心数据按字搜索

时间:2014-03-27 09:16:57

标签: ios iphone objective-c core-data nspredicate

我有一个核心数据对象Contact

Contact
=======
fullName

我正在使用NSFetchedResultsController来显示联系人列表。

我现在想要添加行为如下的搜索选项:

如果用户搜索字符串“ da ”,则结果应为:

亚伦大卫 伯特丹尼尔斯 达纳
约翰大卫

所以搜索结果是按字母顺序排序的字符串,其中以“ da ”开头

我记得看过一个WWDC会话,展示如何创建一个Word对象并独立存储每个单词,但我试图避免这种方法。

所以我的问题是,我可以用我当前的模型结构和一些谓词魔法进行搜索,或者我必须将fullName存储为单独的单词吗?

2 个答案:

答案 0 :(得分:0)

这就是我的所作所为:

NSMutableArray *predicateArray = [NSMutableArray array];
if(searchString.length)
{
    for (NSString* searchStringPart in [searchString componentsSeparatedByString:@" "])
    {
        if([searchStringPart length] > 0)
        {
            [predicateArray addObject:[NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchStringPart]];
        }
    }

    filterPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[filterPredicate, [NSCompoundPredicate andPredicateWithSubpredicates:predicateArray]]];
}

分类:

NSSortDescriptor *sort = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES] autorelease];
NSArray* sortDescriptors = @[sort];
....
[fetchRequest setSortDescriptors:sortDescriptors];

答案 1 :(得分:0)

您需要在数组中按名称对谓词进行过滤。使用以下: -

//Assuming you have store the name in one array
NSArray *names=@[@"Aaron David",@"Bert Daniels",@"Dana",@"John David"];    

//Now use contains in predicate for filtered words 
//On the basis of search string it will filtered accordingly. lets Say yourStringValue=@"on"
NSPredicate *pd=[NSPredicate predicateWithFormat:@"self CONTAINS[CD] %@",yourStringValue];

NSArray *ar=[names filteredArrayUsingPredicate:pd];
NSLog(@"%@",ar);

输出: -

"Aaron David"