Ускорьте получение основных данных - PullRequest
3 голосов
/ 13 декабря 2010

Это на iOS.

У меня есть базовая база данных с около 350 000 объектов. Объекты (Продукт) имеют два свойства: «Штрих-код» и «Обозначение». Пользователь может искать объект путем поиска «Штрих-кода», и «Обозначение» должно быть возвращено. Все работает нормально, кроме медленного. Код, который я использую:

    NSEntityDescription *_product = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:importContext];
NSFetchRequest *fetch = [[NSFetchRequest alloc]init];

[fetch setEntity:_product];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"Barcode == %@",theBarcode]];

 NSError *error = nil;
 NSArray *results = [importContext executeFetchRequest:fetch error:&error];

NSManagedObject *object = [results objectAtIndex:0];

Поскольку я хочу получить только один объект, есть ли способ ускорить его?

Если я загружаю каждый объект в массив при запуске, я получаю очень медленный запуск приложения и отнимаю много памяти.

Заранее спасибо!

РЕДАКТИРОВАТЬ: я добавил [fetch setFetchLimit: 1]; что ускорить это немного. Но скорость становится медленнее, чем дальше в Базе данных находится объект.

Ответы [ 3 ]

7 голосов
/ 13 декабря 2010

Индексируется ли атрибут Barcode?

4 голосов
/ 13 декабря 2010

Во-первых, как писал @paulbailey, проверьте, проиндексировано ли Barcode.

Но, если у вас столько записей, и если ваша запись имеет только два свойства (штрих-код и обозначение), и еслитолько запрашивать со стороны штрих-кода и возвращать обозначенную сторону, использование CoreData может быть излишним.

CoreData предоставляет вам множество объектно-ориентированных средств с сохранением на диске, но, конечно, это сопряжено со штрафом.

Возможно, вам лучше вообще отказаться от CoreData и использоватьsqLite прямо.Для этого есть хорошая облегченная оболочка Objective-C под названием FMDB, см. здесь .

Если вы хотите придерживаться CoreData, один из способов сделать это лучше - выбрать в фоновом режиме.и показать результат в основном потоке, как описано в этого документа Apple .Таким образом, пользовательский интерфейс не останавливается при поиске в базе данных.

0 голосов
/ 13 декабря 2010

Причина, по которой это занимает больше времени, чем дальше вниз по базе данных объект, состоит в том, что Core Data использует довольно скучный алгоритм поиска, который просто помещает указатель на первый объект, понимает его значение для элемента поиска, помещает указатель наследующий и так один до сопоставления.

Существует множество алгоритмов поиска, которые вы можете использовать, в зависимости от вашей базы данных (отсортированные / не отсортированные списки, древовидная структура и т. д.), вы можете использовать Quicksearch, Hashsearches, treesearchи так далее.

Вы также можете подумать о настройке базы данных SQlite, которая имеет несколько хороших платформ с интеллектуальными алгоритмами поиска.

...