如何在一系列日期中使用谓词

时间:2012-09-16 23:40:06

标签: sql cocoa core-data nspredicate

我有一个(SQL)代码数据实体,其属性名为date。我构造一个谓词和获取请求,并声明一个数组来保存结果如下

NSDate *firstDate = <date1>;
NSDate *lastDate = <date2>;
NSArray *dates = [NSArray arrayWithObjects: firstDate, lastDate, nil];
NSPredicate *myPredicate = [NSPredicate predicateWithFormat: 
    @"date BETWEEN %@", dates];

NSFetchRequest * req = [NSFetchRequest fetchRequestWithEntityName:@"myEntity"];
NSArray * results;

以下作品

results = [managedObjectContext executeFetchRequest:req error:nil];
// gets all records
results = [results filteredArrayUsingPredicate:myPredicate];
// results now has the records I wanted

但以下不是

req.predicate = myPredicate;
NSArray * results = [managedObjectContext executeFetchRequest:req error:nil];

这在控制台中

- [__ NSTaggedDate constantValue]:发送到实例的无法识别的选择器...

必须检索所有记录然后过滤它们似乎是错误的。为什么谓词不能用于获取请求?这是一个SQLite限制吗?我知道日期存储为NSTimeInterval s(即双打)并且在谓词中尝试了这些,但是类似的问题。

2 个答案:

答案 0 :(得分:1)

也许这就是你要找的......

datePredicate = [NSPredicate predicateWithFormat:@“(%@&lt; = date&amp;&amp; date&lt; =%@)”,endDate,startDate];

和endDate和startDate是NSDate

答案 1 :(得分:-1)

这是崩溃的原因是因为数组中的内容不应该是NSDate个实例。应该是NSExpression constantValueNSDate的{​​{1}}个对象。 documentation for aggregate expressions says this

  

聚合表达式允许您创建包含表达式的谓词,这些表达式计算为包含更多表达式的集合。

所以你的集合必须包含表达式,而不是日期。