【发布时间】: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 秒不活动后触发搜索。
【问题讨论】:
-
这只是我的看法,不知道你能不能做到,但由于我是做iOS开发的,所以我摆脱了我所有的web-application+relational-database背景,有时我发现对计算多字段值非常有帮助,然后将其存储在非持久性或持久性属性中,仅用于特定的获取请求。请记住在保存和更新 NSManagedObject 期间刷新数据。
-
你在哪个视频中看到了这个,你能分享一下吗?此外,由于您有多个实体,您是使用单个 searchToken 对象还是其中多个?将单个搜索令牌对象连接到多个实体有任何问题吗?感谢您使这个答案如此有用。
标签: iphone ios objective-c core-data