【发布时间】:2011-10-16 10:09:27
【问题描述】:
对于我的 iPhone 应用程序,我为 Core Data 设置了一个数据模型。它包含一个实体Words,其属性为language : String、length : Integer16和word : String。
我用一个单词列表(200k 项)预先填充了我模型的 SQLite 数据库,并使用相同的数据模型编写了一个单独的 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]];
【问题讨论】:
标签: sqlite core-data nsfetchrequest