核心数据: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 * &lt; 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根据一对多的子属性查找父对象?

使用 NSPredicate 获取核心数据对象数组?

使用核心数据在 NSPredicate 中调用对象的方法

带有核心数据对象的 NSPredicate

核心数据 - NSPredicate 用于具有相同列且满足另一个条件的对象

使用 NSPredicate 过滤核心数据中的对象