核心数据:NSPredicate 对象由实体对象组成
Posted
技术标签:
【中文标题】核心数据:NSPredicate 对象由实体对象组成【英文标题】:Core Data: NSPredicate with object made of entity object 【发布时间】:2012-03-09 11:49:08 【问题描述】:例如:
Task *
实体有一个NSDateComponents *dueDate
(可转换)属性。并且打算获取所有NSDate *
值dueDate
小于[NSDate date]
的对象。 NSDateComponents
对象由日历单位常量 NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
创建。
[NSPredicate predicateWithFormat:@"dueDate < %@", [NSDate date]]
是类型不匹配。如何在方程式之前从dueDate
创建NSDate
对象?
或者有没有更好的方法来比较NSDateComponents
?
【问题讨论】:
【参考方案1】:谓词应该是这样的:
[NSPredicate predicateWithFormat:@"%@ < %@", [dueDate date], [NSDate date]]
但如果您只想在谓词之外比较日期,您可以像这样比较它们:
if ([[dueDate date] compare:[NSDate date]] == NSOrderedAscending)
//Then dueDate is earlier than [NSDate date],
你也可以使用NSOrderedSame and NSOrderedDescending
【讨论】:
我没有尝试,但我相信NSDateComponents * < NSDate *
不会起作用。
你说的很对,我还以为是 NSDate,而不是 NSDate 组件。我正在编辑我的答案。【参考方案2】:
我想我找到了最好的解决方案。
首先我写了一个分类:
@implementation NSDateComponents (SSDateComponent)
- (NSComparisonResult)compare:(NSDateComponents *)anotherDateComponents
return [[[NSCalendar currentCalendar] dateFromComponents:self] compare:[[NSCalendar currentCalendar] dateFromComponents:anotherDateComponents]];
然后我希望我可以在谓词格式中使用 ,==。所以我从当前日期创建了NSDateComponents *
(这对我来说也更好),我的谓词看起来像:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"dueDate < %@", dateComponents];
我想知道这是否可以工作,因为 Core Data 中 dueDate
的可转换类型,但它似乎工作得很好。
【讨论】:
以上是关于核心数据:NSPredicate 对象由实体对象组成的主要内容,如果未能解决你的问题,请参考以下文章
iOS核心数据如何使用NSPredicate根据一对多的子属性查找父对象?