优化CoreData全文查询

时间:2011-07-19 20:36:25

标签: objective-c cocoa core-data full-text-search nspredicate

我有一大堆代表文件的CoreData对象。我需要定期搜索此集合并查找存在于给定路径的文件。目前,我正在构建以下NSPredicate并执行相当基本的executeFetchRequest来查找与我的查询匹配的所有结果。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"path ==[c] %@", receivedPath];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Files" inManagedObjectContext:self.moc];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setPredicate:predicate];
[request setFetchBatchSize:10];

NSError *error = nil;
NSArray *results = [self.moc executeFetchRequest:request error:&error];
[request release];

我遇到的问题是这个函数被相当频繁地调用,而executeFetchRequest占执行时间的很大一部分(Instruments告诉我函数占总数的49.2%,占总花费的98.1%)在executeFetchRequest调用上)。我正在使用NSSQLiteStoreType作为持久存储,并在我的MOM中将path属性编入索引。

我的问题是,我该如何优化?我考虑过设置一个lowercasePath属性,并在比较时抛弃[c]修饰符,但不确定对执行时间会产生什么影响(如果有的话)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

删除[c]应该会有所作为。如果我没记错的话,==[c]可能会转换为SQLite LIKE运算符,而SQLite不能使用索引。说到这个,您的模型中是否标记了索引属性?如果没有,你应该这样做,但是再次,通过不区分大小写的搜索,这可能没有什么区别。