4

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

当返回数千条记录时,可能需要几秒钟才能从获取中返回。这使得预先输入的搜索非常笨拙。

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

谢谢。

4

2 回答 2

3

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

  • 将名称字段反规范化为单独的“不区分大小写和变音符号”字段,并使用或searchString代替在该字段上进行搜索。避免和通配符。<<=BEGINSWITHMATCHES
  • 限制NSFetchRequestusingfetchLimitfetchBatchSize
  • 如果您的公司对象很大,您可以将一些关键数据项提取到一个单独的较小的“标题”对象中,该对象仅用于搜索界面。然后在用户进行选择时将关系添加回主对象。

一些指向几个视频的指针(还有其他年份的更多视频):

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

WWDC 2010:第 137 场会议 - 优化 iPhone OS 上的核心数据性能:34:00

于 2012-09-19T15:35:03.257 回答
1

虽然 Core Data 在许多情况下是正确的工具,但无论如何它都不是灵丹妙药。

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

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

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

于 2012-09-18T17:04:30.307 回答