iOS核心数据索引属性未提高性能

时间:2012-04-01 19:36:45

标签: objective-c ios xcode core-data indexing

我在iPad上运行了一个Core Data数据库。它有30,000个联系人,其中包含名字,姓氏等属性。

使用NSCompoundPredicate,搜索性能不佳。我或者是两个LIKE Predicates(在名字和姓氏上),它需要大约1500毫秒来搜索30,000个联系人。然后我尝试将'indexed'属性添加到firstname和lastname字段(使用XCode Data Modeller UI),但性能似乎完全相同。

由于将Indexed属性添加到两个字段,我已从数据库中删除了所有对象并重新填充它。我是否需要做更多的事情才能开始使用索引,我是否希望通过索引复合谓词中使用的两个字段来提高性能?

我在真实设备(iPad3)上运行。搜索30,000个联系人记录的1500毫秒似乎并不那么好 - 它是否适用于该课程?

非常感谢。

1 个答案:

答案 0 :(得分:8)

LIKE搜索费用很高,无论您搜索的属性是否已被编入索引。

许多应用程序 - 包括Apple自己的应用程序 - 通过以用户不会注意到的方式限制搜索来避免此问题。例如,在类似于“联系人”的应用程序中进行搜索时,实际上并不希望将查询与人名的所有可能子字符串相匹配;相反,它匹配名字以查询开头的名字。

为了进一步优化,还要考虑一下,如果LIKEBEGINSWITH找不到完全符合Unicode的,大小写和变音符号的匹配,您可能会离开。 Apple的DerivedProperty示例显示了如何通过存储搜索属性的“规范化”(即所有相同的情况,没有变音符号,其他无关的东西)版本并使用依赖于词典排序的谓词来获得更好的性能(例如normalizedLastName >= "foo" && normalizedLastName < "fop")。

有关这些及相关技巧的更多详细信息,请参阅过去WWDC的一些核心数据会话,尤其是2010 Session 137, "Optimizing Core Data Performance on iPhone OS"