iphone - ios coredata 搜索大型数据集

标签 iphone ios objective-c core-data

我正在为使用 coredata 作为其持久性存储的 iphone 开发企业 ios 应用程序。我们有几个核心数据实体,其中一个有 30~ 个字段。我的数据集超过了这 30 个字段实体中的 45,000 个。

我需要构建一个查询,我的搜索字符串可以匹配对象上 12 个不同字段之一。我的 NSPredicate 基本上是 (property == $A) || 的一个大老鼠巢(otherproperty == $A) ...等等,其中 $A 是我的搜索字符串。

我们刚刚开始调整它的性能,因为它非常糟糕。有什么明显的事情是我们应该做的吗?使用复合谓词并让每个子谓词为 (property == $A) 会更好吗?

想法?提前致谢。

我的(部分)解决方案 - 我看了一些关于core data的wwdc视频,基本上按照Apple说的做了。这是为了创建从我的真实对象到另一个对象的关系来表示搜索 token 。这个新的搜索 token 实体有两个字段 - token 和权重。当我将我的主要对象插入 coredata 时,我给他一组这些搜索标记。我要查询的每个字段一个搜索 token , token 属性的内容是某种规范化(全部小写)数据。那么我的谓词就是“任何 searchTokens.token beginswith %@”。所以现在我们只是在其索引字段上搜索一个表,而不必在 where 子句的右侧进行任何扩展。 Coredata 像这样搜索真的很快。我唯一做的另一件事是在 shouldReloadTableForSearchString 中放置一个 NSTimer,以便仅在 1 秒不活动后才触发搜索。

UISearchDisplayController - wait for N seconds OR for user to press "Search" before conducting search

最佳答案

使用复合谓词将为您提供与使用 || 的长字符串相同的结果,所以不,这无济于事。

可能有帮助的是优化谓词的顺序。它们从左到右进行评估,一旦结果已知,评估就会停止。如果您有一长串逻辑 OR,并且第一个为真,则其余部分看起来如何并不重要。这些谓词甚至不会被评估。

因此,如果您可以合理地预期某些属性比其他属性更可能匹配,请将它们移到列表的前面。如果几乎所有时间都有一个是"is",则将其设为第一个。

此外,如果这些谓词中有任何一个是数字,则将它们移到该行的前面。数字比较比字符串比较快得多,因此任何返回 YES 的数字检查都会让您跳过任何后续字符串比较。

关于iphone - ios coredata 搜索大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19439490/

相关文章:

iphone - XCode 4,错误和警告

iphone - Adobe AIR for iPhone应用程序商店?

ios - HTML5 音频 iPAD,无法播放音频文件?

ios - 根据 UILabel 中的数字动态更改 UIView 宽度

ios - 如何从模态视图 Controller 传递参数?

iphone - 使用echoprint对整个iPhone音乐库进行指纹识别

iphone - 如何在关闭模型 View 时从呈现的模态视图 Controller 调用 rootviewcontroller 中的方法

android - 在 React Native 中从 php url 获取数据并保存到本地 sqlite

ios - 三路交易

ios - PopViewController 占用内存