ios coredata 搜索大型数据集
Posted
技术标签:
【中文标题】ios coredata 搜索大型数据集【英文标题】:ios coredata searching large datasets 【发布时间】:2013-10-18 00:17:05 【问题描述】:我正在为 iphone 开发一个企业 ios 应用程序,该应用程序使用 coredata 作为其持久性存储。我们有几个核心数据实体,其中一个有 30~ 个字段。我的数据集超过了这 30 个字段实体中的 45,000 个。
我需要构建一个查询,其中我的搜索字符串可以匹配对象上的 12 个不同字段之一。我的 NSPredicate 基本上是一个大老鼠窝 (property == $A) || (otherproperty == $A) ... 等等,其中 $A 是我的搜索字符串。
我们刚刚开始调整它以提高性能,因为它非常糟糕。有什么明显的事情我们应该做的吗?使用复合谓词并让每个子谓词为 (property == $A) 会更好吗?
想法?提前致谢。
我的(部分)解决方案 - 我看了一些关于核心数据的 wwdc 视频,基本上做到了苹果所说的。这是创建从我的真实对象到另一个对象的关系以表示搜索令牌。这个新的搜索令牌实体有两个字段——令牌和权重。当我将我的主要对象插入 coredata 时,我给了他一组这些搜索标记。我要查询的每个字段一个搜索令牌,令牌属性的内容是某种标准化(全小写)数据。那么我的谓词就是“任何 searchTokens.token 以 %@ 开头”。所以现在我们只是在它的索引字段上搜索一个表,我们不必在 where 子句的右侧做任何 expersions。 Coredata 的搜索速度非常快。我唯一做的另一件事是在 shouldReloadTableForSearchString 中放置一个 NSTimer,以便仅在 1 秒不活动后触发搜索。
UISearchDisplayController - wait for N seconds OR for user to press "Search" before conducting search
【问题讨论】:
这只是我的看法,不知道你能不能做到,但由于我是做iOS开发的,所以我摆脱了我所有的web-application+relational-database背景,有时我发现对计算多字段值非常有帮助,然后将其存储在非持久性或持久性属性中,仅用于特定的获取请求。请记住在保存和更新 NSManagedObject 期间刷新数据。 你在哪个视频中看到了这个,你能分享一下吗?此外,由于您有多个实体,您是使用单个 searchToken 对象还是其中多个?将单个搜索令牌对象连接到多个实体有任何问题吗?感谢您使这个答案如此有用。 【参考方案1】:使用复合谓词将得到与带有||
的长字符串相同的结果,所以不,这无济于事。
可能有帮助的是优化谓词的顺序。它们从左到右进行评估,一旦知道结果,评估就会停止。如果您有一长串逻辑 OR,并且第一个为真,那么其余的看起来如何并不重要。这些谓词甚至不会被评估。
因此,如果您可以合理地预期某些属性比其他属性更可能匹配,请将它们移到列表的前面。如果几乎所有时间都为“是”,则将其设为第一个。
此外,如果这些谓词中的任何一个是数字,则将它们移到行的前面。数字比较比字符串比较快得多,因此任何返回 YES 的数字检查都可以让您跳过任何后续字符串比较。
【讨论】:
同样在 NSFetchRequest 上,您可以指定获取限制和/或批量大小 是的 - 批量大小确实有很大帮助!谢谢。 谢谢汤姆!我认为这就是 coredata 在幕后所做的,但我不确定..以上是关于ios coredata 搜索大型数据集的主要内容,如果未能解决你的问题,请参考以下文章