我该如何使用NSPredicate代码?

我在使用NSPredicate时遇到了麻烦。 我有一个名为Entry的核心数据对象,它包含一个名为creationDate的NSDate。 我想将它与我称之日期的变量进行比较。

我正在使用NSDate类别来提取两个对象的单独年份,以及核心数据类别来对我的核心数据存储中的所有Entry对象执行谓词。

[Entry allForPredicate:[NSPredicate predicateWithFormat:@"creationDate.year == %i", date.year]]; 

我认为这是错误的,因为它没有给我我期望的结果,而是变成空白。

我哪里错了?

我怀疑,Core Data可以在创建原始数据库调用时合并Categories。

为您的情况创建2个日期,一个与今年1月1日在0:00和一年后

  NSString *basePredicateString = @"creationDate >= %@ AND creationDate < %@"; NSPredicate *predicate = [NSPredicate predicateWithFormat:basePredicateString, startDate, endDate]; 

为了完整起见 - 我将如何生成实际年份的开始和结束日期:

 NSDate *startDate = [NSDate date]; [[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startDate interval:NULL forDate:startDate]; NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease]; comps.year = 1; NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:comps toDate:startDate options:0]; 

编辑
在下面的评论中,这个答案,jbrennan提出,确实一个类别可以被包含在一个谓词中。 虽然他适合作为NSArrays的集合(他添加了一个测试项目的链接),但它在核心数据获取请求时不起作用 - 至少我无法使其工作。 我试过了。 这是我的测试: https : //github.com/vikingosegundo/CoreDataCategoryTest

@vikingosegundo有正确的答案 – 你不能在谓词中使用类别。

如果您了解SQL,请尝试设置以下“ 启动时传递的参数 ”:

-com.apple.CoreData.SQLDebug 1

这将允许您查看请求生成的SQL。 这应该可以帮助您了解您编写的谓词是如何转换为SQL的。


再次编辑 @vikingosegundo – 以上适用于根据OP的问题与CoreData一起使用时。