核心数据NSPredicate不会在两个日期之间返回记录

时间:2013-04-08 16:25:42

标签: ios core-data

我有一个CoreData实体Comment,它有一个父实体Measurement

Measurement实体具有measurementDate属性。

我的核心数据库中有200条Comment条记录,每条记录在过去3年内都有不同的measurementDate值。

我正在尝试获取measurementDate在任意两个给定日期之间的记录。

首先,我尝试了这个:

//now fetch a record between 12 and 11 months ago
NSDate *startDate = [AppGlobals dateByAddingMonths:[NSDate date] withMonths:-12];
NSDate *endDate = [AppGlobals dateByAddingMonths:startDate withMonths:1];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(measurementDate >= %@) AND (measurementDate <= %@)", startDate, endDate];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Comment" inManagedObjectContext:self.context]];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *results = [self.context executeFetchRequest:request error:&error];

但我得到了0个结果。

然后我尝试用更简单的东西替换我的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"measurementDate >= %@", startDate];

这应该会返回我的结果的大约三分之一。但实际上它会返回所有200个记录。

我已经注销了对象的日期,看起来日期被完全忽略了!

我做错了什么???

是否与父抽象实体Measurement有关,因为我是从Comment实体而不是Measurement实体获取的? 是因为我在我的代码中使用“原始数据类型的标量属性”吗?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

我认为问题在于您将日期值分配给托管对象。如果measurementDate被定义为标量属性

@property (nonatomic) NSTimeInterval measurementDate;

然后您使用

为其分配NSDate
NSDate *theDate;
obj.measurementDate = [theDate timeIntervalSinceReferenceDate];

答案 1 :(得分:0)

您应该使用NSDate或使用NSTimeInterval(原语,因为它实际上是double)。

如果你混合使用它们,你很容易混淆自己。基本上,NSDate对象是一个包含NSTimeInterval值的类,即double - 仅此而已。并且NSDate添加了许多处理该值的方法。

但编译器本应给你一些警告。