我如何做这个NSPredicate代码?

时间:2012-06-08 18:34:32

标签: objective-c ios cocoa-touch core-data nspredicate

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

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

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

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

我在哪里错了?

2 个答案:

答案 0 :(得分:4)

我怀疑,核心数据在创建原始数据库调用时可以合并类别。

对于您的案例,创建2个日期,一个是今年1月1日0:00和一年后

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

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

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

答案 1 :(得分:1)

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

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

-com.apple.CoreData.SQLDebug 1

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


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