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

使用NSCompoundPredicate的搜索性能不是很好。我正在使用两个LIKE谓词(名字和姓氏),搜索30,000个联系人大约需要1500毫秒。然后,我尝试将'indexed'属性添加到名字和姓氏字段(使用XCode Data Modeller UI),但性能似乎完全相同。

自将Indexed属性添加到两个字段后,我从数据库中删除了所有对象并重新填充了它。我是否需要做更多的事情才能开始使用索引,我是否应该通过索引复合谓词中正在使用的两个字段来实现性能提升?

我在真实设备(iPad3)上运行。 1500毫秒来搜索30,000个联系记录似乎并不好-这门类(class)是否合乎标准?

非常感谢。

最佳答案

不管是否对要搜索的属性建立索引,LIKE搜索都非常昂贵。

许多应用程序(包括Apple自己的应用程序)通过以用户不会注意到的方式限制搜索来避免此问题。例如,在键入诸如“联系人”之类的应用程序时进行搜索实际上并不想将查询与人们姓名的所有可能的子字符串进行匹配;而是匹配名字或姓氏以查询开头的人。

为了进一步优化,还请考虑,如果没有LIKEBEGINSWITH可以帮助您的完全Unicode识别,区分大小写和变音符号的匹配,您可能就可以摆脱困境。 Apple的DerivedProperty示例显示了如何通过存储搜索属性的“规范化”(即所有相同的情况,没有变音符号,其他无关紧要的东西)版本并使用依赖于字典顺序的谓词(例如normalizedLastName >= "foo" && normalizedLastName < "fop")来获得更好的性能。

有关这些技巧和相关技巧的更多详细信息,可以在过去的WWDC的一些Core Data session 中找到,尤其是2010 Session 137, "Optimizing Core Data Performance on iPhone OS"

关于objective-c - iOS核心数据索引属性无法提高性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9967625/

10-14 21:41
查看更多