0

我有兩個NSDate的性質的實體:核心數據提取謂詞的NSDate

@property NSDate *startTime; 
@property NSDate *endTime; 

我用它來創建點事件和時間的事件。所以,對於點事件endTime可以等於零。

,我想取得與限制所有實體:開始時間> =的minDate & &結束時間< =的maxDate

但NSPredicate,如:

NSDate *startTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"firstBound"]; 
NSDate *endTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"secondBound"]; 
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(startTime >= %@) AND ((endTime <= %@) OR (endTime == nil))",startTime,endTime]]; 

無法正常工作。我會解釋。如果存儲在數據庫中的所有事件都處於2000-2010年範圍內,並且我正在使用minDate = 1900進行提取,則maxDate = 1950每個來自數據庫的點事件都符合此謂詞,因爲它們的endTime字段爲零,而字段startTime明顯多於minDate。

任何想法如何處理?不受NSPredicate限制。我會處理任何決定。

+0

在謂語開啓和關閉括號不匹配。謂詞中的「e」是什麼? - 不應該是'「startTime> =%@ AND(endTime ==零或endTime <=%@)」'? –

+0

正確,刷新網站:)我已經做了一些修復。 –

回答

0

想必你想要的:

"((endTime != nil) and (startTime >= %@) and (endTime <= %@)) or 
((endTime = nil) and (startTime >= %@) and (startTime <= %@))", 
startTime, endTime, startTime, endTime 

雖然它會更容易,如果你瞬時事件存儲爲只是有相同的開始和結束時間。

+0

這對我有些副作用,但感謝最簡單和簡單的解決方案:)我關於保存相同的開始和結束時間。 –

+0

我討厭自己過早的判斷。具有相同日期的解決方案不起作用。如果搜索邊界小於現有值,則謂詞爲true的解決方案,但如果它們更大,則不是這樣。 –

+0

我只是將相同的數據保存到startTime和endTime,然後謂詞 [NSPredicate predicateWithFormat:@「((startTime> =%@)和(endTime <=%@))」,startTime,endTime] 可以在所有情況下工作。再次感謝指導:) –

0

我正面臨同樣的問題。但解決了。核心數據本身以時間間隔格式存儲NSDate。當您通過NSDate作爲謂詞的參數時,謂詞將類型轉換爲時間間隔並進行比較。我做了同樣的事但它沒能返回結果。所以明確地將日期轉換爲時間間隔是可行的。

我希望得到的項目列表,它比maxCreatedDate少爲createdDate和小於minCreatedDate

對於我的問題,我用類似如下:

[NSPredicate predicateWithFormat:@"createdDate >= %f AND createdDate <= %f", [minCreatedDate timeIntervalSince1970], [maxCreatedDate timeIntervalSince1970]]; 

這爲我工作。你可以試試這個:

[NSPredicate predicateWithFormat:@"(startTime >= %f) AND ((endTime <= %f) OR (endTime == nil))",[startTime timeIntervalSince1970], [endTime timeIntervalSince1970]];