我有一大堆代表文件的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]修饰符,但不确定对执行时间会产生什么影响(如果有的话)。
非常感谢任何帮助。
答案 0 :(得分:0)
删除[c]
应该会有所作为。如果我没记错的话,==[c]
可能会转换为SQLite LIKE
运算符,而SQLite不能使用索引。说到这个,您的模型中是否标记了索引属性?如果没有,你应该这样做,但是再次,通过不区分大小写的搜索,这可能没有什么区别。