2011-07-19 40 views
1

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

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被占的执行时间的百分比显著(仪器告诉我函数占了总计约49.2%,98.1%在executeFetchRequest调用上花费的总数)。我为我的持久性存储使用NSSQLiteStoreType,并在我的MOM中索引了path属性。

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

任何帮助将不胜感激。

+0

Mac或iOS?在Mac上,[Search Kit](http://developer.apple.com/library/mac/#documentation/UserExperience/Reference/SearchKit/Reference/reference.html)可能更适合全文搜索。 – omz

+0

我为不提及而道歉。这是在Mac上。 – ndg

回答

0

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

+0

这给了我一点希望。启用了-com.apple.CoreData.SQLDebug参数后,我无法看到正在执行的任何LIKE查询。看起来,所有全文比较都是由NSCoreDataStringCompare函数执行的,我无法找到相关文档。 – ndg

+0

它可能与'LIKE'类似,可以将SQLite配置为在查询中使用自定义函数。当你使用普通的'=='时,你会看到相同的结果吗? – omz

+0

不是!看起来好像删除[c]修饰符导致一个简单的路径=?查询。如果它解决了问题,我会试一试并标记您的答案正确! – ndg