Core Data 是不是比“as-you-type”搜索的自定义索引更有效?
Posted
技术标签:
【中文标题】Core Data 是不是比“as-you-type”搜索的自定义索引更有效?【英文标题】:Is Core Data more efficient than custom indexing for "as-you-type" searching?Core Data 是否比“as-you-type”搜索的自定义索引更有效? 【发布时间】:2009-09-26 14:25:20 【问题描述】:实际上,我正在开发基于 Core Data 的 iPhone 应用程序。我有两个实体,每个实体包含超过 200000 行,并且在检索数据期间遇到了一些性能问题。对于每个获取请求,我必须等待 1 到 2 秒才能获得结果。 我正在考虑实现一个自定义搜索引擎来索引我的数据,但问题是整个数据库是可编辑的。内容可以随时更改,因此索引动态内容数据库是愚蠢的。
我想知道 Core Data 是否足够高效以提供即时搜索。在 Apple 文档中,一千行实体被认为很小。对吗?
有没有人有解决方案来提高 Core Data 的速度...?还是我应该实现自己的搜索引擎?
目标是提供即时搜索,即在您键入机制时进行搜索。
[更新] 下面是我的一个 fetch 请求的 sn-p...
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];
【问题讨论】:
您获取的数据是否超出了您的需要?我会仔细查看您的获取请求,并仅返回显示屏幕上内容所需的最低限度。看看 NSFetchRequest 上的 setPropertiesToFetch: 看看你是否可以把它削减一点。还要确保您的模型已正确编入索引。 请显示您的提取请求 - 您执行提取的方式略有不同可能会对性能产生很大影响。 你可以看我上面的fetch请求! 【参考方案1】:您可以尝试几种方法。
1) 尝试使用 setFetchBatchSize: 来减少应用中的工作数据集。与 NSFetchedResultsController 结合使用,这将根据需要透明地对批次进行故障处理,并根据需要显示表上的对象。
2) 验证是否可以将 setResultType: 与 NSManagedObjectIDResultType 一起使用。这将只返回匹配对象的 ID;如果您在执行 fetch 请求后只需要访问其中的一个或几个,那么额外的开销确实很小,但 fetch 会快得多。如果您需要访问所有返回的对象,那么这不是要走的路。
3) 如果您需要检索存储在对象中的属性,请按照 Hunter 的建议使用 setPropertiesToFetch: 仅检索您真正需要的属性
4) 如果您的模型包含实体的子实体,则验证您是否可以使用 setIncludesSubentities:将 NO 作为参数传递。
5) 如果您不需要处理与获取请求关联的谓词匹配的所有对象,则使用 setFetchLimit: 检索固定数量的对象。
希望这会有所帮助。
【讨论】:
【参考方案2】:您是否尝试过标记数据模型中索引的所有可编辑元素?正如您所说,索引所有内容似乎很奇怪,但 Core Data 应该足够聪明以适当地处理这个问题。
【讨论】:
以上是关于Core Data 是不是比“as-you-type”搜索的自定义索引更有效?的主要内容,如果未能解决你的问题,请参考以下文章