2012-09-16 66 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