Оптимизация полнотекстового запроса CoreData - PullRequest
1 голос
/ 20 июля 2011

У меня есть большая коллекция объектов 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 для своего постоянного хранилища, и атрибут path проиндексирован в моей MOM.

У меня вопрос, как я могу оптимизировать это?Я рассмотрел вопрос о настройке атрибута lowercasePath и исключении модификатора [c] при сравнении, но не уверен относительно того, какое влияние (если таковое имеется) окажет влияние на время выполнения.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 20 июля 2011

Удаление [c] должно иметь значение.==[c], вероятно, переведено в оператор SQLite LIKE, для которого SQLite не может использовать индексы, если я правильно помню.Кстати, у вас есть атрибут, помеченный как индексированный в вашей модели?Если нет, вы должны сделать это, но, опять же, с поиском без учета регистра, это, вероятно, не имеет значения.

...