我在使用NSPredicate时遇到了麻烦。我有一个名为Entry的核心数据对象,它包含一个名为creationDate的NSDate。我想将它与我称之日期的变量进行比较。
我正在使用NSDate类别来提取两个对象的单独年份,以及核心数据类别来对我的核心数据存储中的所有Entry对象执行谓词。
[Entry allForPredicate:[NSPredicate predicateWithFormat:@"creationDate.year == %i", date.year]];
我认为这是错误的,因为它没有给我我期望的结果,而是变成空白。
我在哪里错了?
答案 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一起使用时。