我有Contact : NSManagedObject
。我想按name
(全名)搜索所有联系人。搜索应该像iPhone的联系人应用程序一样。因此,如果name
中的每个字都以searchString
中的任何字开头,searchString
都会匹配name
。搜索是案例&变音符号不敏感。
例如,name
“Matt Di Pasquale”匹配searchString
“Matt Pa”,“Matt Mat”和“PasqDimá”,但与“att”或“squale”不匹配。< / p>
答案 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] %@
应该限制获取对象的数量并且可能加快速度。