NSPredicate:与日期iOS的to-Many关系

Posted

技术标签:

【中文标题】NSPredicate:与日期iOS的to-Many关系【英文标题】:NSPredicate: to-Many relationship with date iOS 【发布时间】:2014-09-25 08:01:14 【问题描述】:

我正在处理核心数据关系,遇到了一种复杂的情况。 我有两个实体,分别是 CustomersOrders

一位客户可以订购多件商品。所以,这是从客户到订单的多对多关系。

查询:获取一个月内未订购的所有客户。

使用核心数据获得结果的最佳方式是什么?


更新:

用这个谓词试过了:

NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"ANY custOrders.treatDate <= %@", endDate];

实际上它给我的结果是客户是否在一个月前订购了.. 如果它再次订购,那么它也会返回结果。 我只想要一个月以来没有订购的客户的结果.. !!!

【问题讨论】:

假设您的意思是比获取 custOrders.treatData 超过一个月的所有客户更优化? 这是有道理的,因为您需要找到 MAX 日期而不仅仅是任何日期 【参考方案1】:

你的谓词不正确;搜索@"ANY custOrders.treatDate &lt;= %@" 将返回在提供的时间段内有ANY订单的客户。您要做的是找到最大订单日期小于一个月前的客户。

Core Data 的一个漂亮但鲜为人知的功能是您可以使用 max、min 和 sum 等基础集合运算符进行查询。

这应该可行:

NSPredicate *p = [NSPredicate predicateWithFormat:@"custOrders.@max.treatDate <= %@", endDate];

【讨论】:

还有一个问题:如何获取本月生日的“客户”?核心数据以timeInterval的形式保存NSDate...!!! 那么您需要找到月初和月底,并搜索该范围内的所有日期。或者,您可以将他们的生日保存为多个属性,月、日、年,然后您可以这样查询:)【参考方案2】:

也许你可以使用反向谓词:

NSPredicate *notFilter = [NSCompoundPredicate notPredicateWithSubpredicate:filter];

【讨论】:

以上是关于NSPredicate:与日期iOS的to-Many关系的主要内容,如果未能解决你的问题,请参考以下文章

AND 和 OR 与 NSPredicate 结合。 IOS 斯威夫特

iOS之深入解析谓词NSPredicate的语法与应用

IOS/目标 C:Coredata NSPredicate 与布尔值

速度:iOS 使用 NSPredicate filterUsingPredicate 与 for 循环

日期的核心数据 NSPredicate

NSPredicate 获取具有 NSDate 日期范围内的日期属性的核心数据对象