我正在为使用 coredata 作为其持久性存储的 iphone 开发企业 ios 应用程序。我们有几个核心数据实体,其中一个有 30~ 个字段。我的数据集超过了这 30 个字段实体中的 45,000 个。
我需要构建一个查询,其中我的搜索字符串可以匹配对象上的 12 个不同字段之一。我的 NSPredicate 基本上是一个大老鼠窝 (property == $A) || (otherproperty == $A) ... 等等,其中 $A 是我的搜索字符串。
我们刚刚开始调整它的性能,因为它非常糟糕。有什么明显的事情我们应该做的吗?使用复合谓词并让每个子谓词为 (property == $A) 会更好吗?
想法?提前致谢。
我的(部分)解决方案——我看了一些关于核心数据的 wwdc 视频,基本上按照苹果所说的做了。这是创建从我的真实对象到另一个对象的关系以表示搜索标记。这个新的搜索令牌实体有两个字段——令牌和权重。当我将我的主要对象插入 coredata 时,我给了他一组这些搜索标记。我要查询的每个字段一个搜索令牌,令牌属性的内容是某种标准化(全小写)数据。那么我的谓词就是“任何 searchTokens.token 以 %@ 开头”。所以现在我们只是在它的索引字段上搜索一个表,我们不必在 where 子句的右侧做任何 expersions。Coredata 的搜索速度非常快。