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”搜索的自定义索引更有效?的主要内容,如果未能解决你的问题,请参考以下文章

检查Core Data中是不是存在对象[关闭]

NSFetchedResultsController 是不是应该始终与 Core Data 一起使用?

Core Data/SQLite 是不是压缩冗余信息?

使用 Core Data 时是不是需要本地数组?

如何检查关系是不是已建立 - Core Data

如何使用 Core Data 和抽象实体创建主从接口?