Для приложения iPhone я настроил модель данных для Core Data.Он содержит одну сущность Words
, а его атрибуты language : String
, length : Integer16
и word : String
.
. Я предварительно заполнил базу данных SQLite своей модели списком слов (200 тыс. Элементов), написав отдельное приложение для iPhone с помощьюидентичная модель данных и копирование заполненной базы данных в основное приложение.
Теперь, используя NSFetchedRequest, я могу запрашивать управляемые объекты, как мне нравится, но результаты приходят медленно.Я использую следующий метод:
- (NSString *)getRandomWordLengthMin:(int)minLength max:(int)maxLength
{
NSString *word = @"";
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Words"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSString *predicateString = @"length >= %d AND length <= %d";
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString,
minLength, maxLength];
[fetchRequest setPredicate:predicate];
NSError *error = nil;
int entityCount = [context countForFetchRequest:fetchRequest error:&error];
[fetchRequest setFetchLimit:1];
if(entityCount != 0)
{
[fetchRequest setFetchOffset:arc4random()%entityCount];
}
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if([fetchedObjects count] != 0)
{
Words * test = [fetchedObjects objectAtIndex:0];
word = [NSString stringWithFormat:@"%@", [test word]];
}
return word;
}
Используя редактор SQLite, я уже установил индекс вручную для столбца zLength, но это не принесло никакого ускорения.Где узкое место?
РЕДАКТИРОВАТЬ:
Я понял, что получение int entityCount = ...
идет медленно.Но даже получить все объекты и затем выбрать одно случайное слово медленно:
Words * test = [fetchedObjects objectAtIndex:arc4random()%[fetchedObjects count]];