2012-09-16 33 views
0

我有一个具有名为date的属性的(SQL)代码数据实体。我建立一个谓语和读取请求,并宣布一个数组来保存结果如下如何在一系列日期中使用谓词

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(即双打),并且已经在谓词中尝试了这些,但是类似的问题。

+1

可能重复的[NSPredicate BETWEEN用的NSDate原因 - \ [__的NSDate constantValue \]:无法识别的选择发送到实例0x1e7ff0](http://stackoverflow.com/questions/5268272/ nspredicate-with-nsdate-causes-nsdate-constantvalue-unrecognized -s) –

+0

非常感谢提示,尽管我仍然不明白原因。将BETWEEN分解为单独的子种族适用于我。 – AlexT

+0

我已经提供了一个为什么会崩溃的答案。这就是说,在使用核心数据时,你仍然不能使用“BETWEEN”。 –

回答

-1

这是崩溃的原因是因为数组内的东西不应该是NSDate实例。应该是NSExpression对象,其constantValueNSDatedocumentation for aggregate expressions says this

聚合表达式允许您创建包含表达式的谓词,该表达式评估为包含更多表达式的集合。

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

1

也许这是你在找什么..

datePredicate = [NSPredicate predicateWithFormat:@ “(%@ < =日期& &日期< =%@)”,结束日期,的startDate]。

和结束日期且StartDate是的NSDate