像iPhone联系人应用程序的核心数据搜索

时间:2012-01-23 02:26:07

标签: iphone regex core-data nspredicate nsfetchedresultscontroller

我有Contact : NSManagedObject。我想按name(全名)搜索所有联系人。搜索应该像iPhone的联系人应用程序一样。因此,如果name中的每个字都以searchString中的任何字开头,searchString都会匹配name。搜索是案例&变音符号不敏感。

例如,name“Matt Di Pasquale”匹配searchString“Matt Pa”,“Matt Mat”和“PasqDimá”,但与“att”或“squale”不匹配。< / p>

1 个答案:

答案 0 :(得分:1)

更新:观看WWDC 2010 Session Video: Optimizing Core Data Performance on iPhone OS以更快的方式执行此操作。

根据another answer about NSPredicate,使用ICU regular expression从子预测中创建NSCompoundPredicate

NSArray *searchWords = [searchString words]; // see link below (1)
NSMutableArray *subpredicates = [NSMutableArray arrayWithCapacity:[searchWords count]];
for (NSString *searchWord in searchWords) {
    [subpredicates addObject:[NSPredicate predicateWithFormat:
                              @"name CONTAINS[cd] %@ AND" // maybe speeds it up
                              " name MATCHES[cd] %@",
                              searchWord, [NSString stringWithFormat:
                                           @".*\\b%@.*", searchWord]]];
}
fetchRequest.predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];

我认为在将对象提取到内存后会发生MATCHES过滤,因此name CONTAINS[cd] %@应该限制获取对象的数量并且可能加快速度。

(1)Cocoa Plant implements -[NSString words]