NSPredicate:与日期iOS的to-Many关系
Posted
技术标签:
【中文标题】NSPredicate:与日期iOS的to-Many关系【英文标题】:NSPredicate: to-Many relationship with date iOS 【发布时间】:2014-09-25 08:01:14 【问题描述】:我正在处理核心数据关系,遇到了一种复杂的情况。 我有两个实体,分别是 Customers 和 Orders。
一位客户可以订购多件商品。所以,这是从客户到订单的多对多关系。
查询:获取一个月内未订购的所有客户。
使用核心数据获得结果的最佳方式是什么?
更新:
用这个谓词试过了:
NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"ANY custOrders.treatDate <= %@", endDate];
实际上它给我的结果是客户是否在一个月前订购了.. 如果它再次订购,那么它也会返回结果。 我只想要一个月以来没有订购的客户的结果.. !!!
【问题讨论】:
假设您的意思是比获取 custOrders.treatData 超过一个月的所有客户更优化? 这是有道理的,因为您需要找到 MAX 日期而不仅仅是任何日期 【参考方案1】:你的谓词不正确;搜索@"ANY custOrders.treatDate <= %@"
将返回在提供的时间段内有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/目标 C:Coredata NSPredicate 与布尔值