Iphone 核心数据是否比自定义索引更高效;当您键入“时”;搜索?
实际上,我正在开发一个基于核心数据的iPhone应用程序。我有两个实体,每个实体包含超过200000行,在检索数据时遇到一些性能问题。对于每个获取请求,我必须等待1到2秒才能获得结果。 我正在考虑实现一个自定义搜索引擎来索引我的数据,但问题是整个数据库是可编辑的。内容可以随时更改,因此为动态内容数据库编制索引是愚蠢的 我想知道核心数据是否有足够的效率来提供即时搜索。在Apple文档中,千行实体被认为是小的。是这样吗 有没有人有办法提高核心数据的速度。。。?或者我应该实现自己的搜索引擎 目标是提供即时搜索,即键入mecanism时的搜索 [更新] 下面是我的一个获取请求的片段Iphone 核心数据是否比自定义索引更高效;当您键入“时”;搜索?,iphone,cocoa-touch,core-data,Iphone,Cocoa Touch,Core Data,实际上,我正在开发一个基于核心数据的iPhone应用程序。我有两个实体,每个实体包含超过200000行,在检索数据时遇到一些性能问题。对于每个获取请求,我必须等待1到2秒才能获得结果。 我正在考虑实现一个自定义搜索引擎来索引我的数据,但问题是整个数据库是可编辑的。内容可以随时更改,因此为动态内容数据库编制索引是愚蠢的 我想知道核心数据是否有足够的效率来提供即时搜索。在Apple文档中,千行实体被认为是小的。是这样吗 有没有人有办法提高核心数据的速度。。。?或者我应该实现自己的搜索引擎 目标是提供
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];
你可以尝试几种方法 1) 尝试使用setFetchBatchSize:减少应用程序中的工作数据集。与NSFetchedResultsController结合使用,这将根据需要透明地显示批,根据需要显示表上的对象 2) 验证是否可以将setResultType:与NSManagedObjectResultType一起使用。这将只返回匹配对象的ID;如果在执行提取请求后只需要访问其中的一个或几个,那么额外的开销确实很小,但提取速度要快得多。如果您需要访问所有返回的对象,那么这不是一种方法 3) 如果您需要检索存储在对象中的属性,请按照Hunter的建议使用setPropertiesToFetch:只检索您真正需要的属性 4) 如果模型包含实体的子实体,请验证是否可以使用setIncludesSubentities:将否作为参数传递 5) 如果不需要处理与获取请求关联的谓词匹配的所有对象,则使用setFetchLimit:检索固定数量的对象
希望这有帮助。您是否尝试过标记数据模型中索引的所有可编辑元素?正如您所说,索引所有内容似乎很奇怪,但核心数据应该足够聪明,能够适当地处理这一问题。您获取的数据是否超出了需要?我会仔细查看您的获取请求,只返回屏幕上显示内容所需的最小值。查看NSFetchRequest上的setPropertiesToFetch:以查看您是否能够将其缩减一点。另外,请确保您的模型已正确索引。请显示您的获取请求-在执行获取的方式上稍有不同会对性能产生很大影响。您可以查看上面我的获取请求!