使用CoreData令人失望的iOS搜索时间

时间:2012-09-18 16:32:07

标签: ios core-data full-text-search uisearchbar nsfetchrequest

我在iOS 5.1.1的ipad上运行了一个coredata数据库。我的数据库中有大约50,000家公司。我已经在公司名称属性上创建了一个索引。我正在搜索此属性,有时会使用fetchRequest返回数千条记录。

当返回几千条记录时,从获取返回可能需要几秒钟。这使得提前输入搜索非常笨重。

我预计未来会有更大的数据库。我有什么选择来实现真正快速的搜索功能?

感谢。

2 个答案:

答案 0 :(得分:3)

我建议观看最近几个WWDC的核心数据性能视频。他们经常谈论改善这种瓶颈的策略。视频中的一些建议:

  • 将名称字段取消规范化为单独的“case and diacritic insensitive”searchString字段,然后使用<<=BEGINSWITH搜索该字段。避免使用MATCHES和通配符。
  • 使用NSFetchRequestfetchLimit
  • 限制fetchBatchSize返回的结果数量
  • 如果您的公司对象很大,您可以将一些关键数据项提取到一个单独的较小的“标题”对象上,该对象仅用于搜索界面。然后在用户进行选择时将关系添加回主对象。

一些视频的指针(其他年份也有更多):

WWDC 2012:会议214 - 核心数据最佳实践:45:00

WWDC 2010:Session 137 - 在iPhone OS上优化核心数据性能:34:00

答案 1 :(得分:1)

虽然核心数据在许多情况下是正确的工具,但它绝不是一颗银弹。

查看这篇文章,讨论一些优化策略以及SQL数据库是您更好的选择而不是核心数据的情况:

http://inessential.com/2010/02/26/on_switching_away_from_core_data

在这种情况下,您可能更好地使用SQL数据库而不是Core Data,因为当您尝试访问Core Data实体上的属性值时,通常会导致错误并将对象拉入活动内存...绝对可以有性能和速度成本。使用真正的数据库 - 核心数据不是真正的数据库,请参阅http://cocoawithlove.com/2010/02/differences-between-core-data-and.html - 您可以查询数据库而无需从中创建对象。