1

我在使用 NSPredicate 时遇到问题。我有一个名为 Entry 的核心数据对象,其中包含一个名为 creationDate 的 NSDate。我想将此与我称为日期的变量进行比较。

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

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

我认为这是错误的,因为它没有给我预期的结果,而是出现空白。

我哪里错了?

4

2 回答 2

4

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

为您的案例创建 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 的集合(他添加了一个指向测试项目的链接),但在涉及 Core Data 获取请求时它不起作用——至少我不能让它起作用。我试过了。这是我的测试:https ://github.com/vikingosegundo/CoreDataCategoryTest

于 2012-06-08T18:52:30.987 回答
1

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

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

-com.apple.CoreData.SQLDebug 1

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


再次按@vikingosegundo编辑-根据OP 的问题与CoreData 一起使用时,上述内容适用。

于 2012-06-08T18:58:48.327 回答