实际上,我正在研究基于Core Data的iPhone应用程序。我有两个实体,每个实体包含超过200000行,我在检索数据时遇到一些性能问题。对于每个获取请求,我必须在获得结果之前等待1到2秒。 我正在考虑实现一个自定义搜索引擎来索引我的数据,但问题是整个数据库是可编辑的。内容可以随时更改,因此索引动态内容数据库是愚蠢的。
我想知道Core Data是否足够高效以提供即时搜索。在Apple文档中,千行实体被认为是小的。是吗?
有没有人有解决方案来提高核心数据的速度......?或者我应该实现自己的搜索引擎?
目标是在您键入机智时提供即时搜索和搜索。
[UPDATE] 以下是我的抓取请求之一的片段...
NSString *predicateString = [NSString stringWithFormat:@"^(.*\\b)?%@(\\b.*)?$", searchString];
NSString *predicate = [NSString stringWithString:@"text MATCHES[cd] %@"];
NSArray *arguments = [NSArray arrayWithObjects:predicateString, nil];
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:[[HYDataManager instance] managedObjectContext]]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:predicate argumentArray:arguments]];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:[[NSSortDescriptor alloc] initWithKey:@"length" ascending:YES], [[NSSortDescriptor alloc] initWithKey:@"subEntity.attr1" ascending:YES], [[NSSortDescriptor alloc] initWithKey:@"subEntity.attr2" ascending:YES], nil]];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:@"subEntity"]];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[[HYDataManager instance] managedObjectContext] sectionNameKeyPath:nil acheName:nil];
答案 0 :(得分:2)
你可以尝试几件事。
1)尝试使用setFetchBatchSize:减少应用中的工作数据集。与NSFetchedResultsController结合使用时,它将根据需要透明地对批处理进行故障处理,并根据需要显示表中的对象。
2)验证是否可以使用setResultType:with NSManagedObjectIDResultType。这将只返回匹配对象的ID;如果在执行获取请求后只需要访问其中的一个或几个,那么额外的开销实际上很小,但获取速度要快得多。如果您需要访问所有返回的对象,那么这不是可行的方法。
3)如果您需要检索存储在对象中的属性,请使用setPropertiesToFetch:如Hunter建议的那样只检索您真正需要的属性
4)如果你的模型包含你的实体的子实体,那么验证你是否可以使用setIncludesSubentities:传递NO作为参数。
5)如果你不需要处理与你的获取请求相关的谓词匹配的所有对象,那么使用setFetchLimit:来检索固定数量的对象。
希望这有帮助。
答案 1 :(得分:0)
您是否尝试过标记数据模型中索引的所有可编辑元素?如你所说,索引所有内容似乎很奇怪,但核心数据应该足够聪明,以便适当地处理它。