2017-01-15 77 views
0

我保存了實體併爲它們提供了一個名爲「date」的屬性。我的目標是獲取特定時間的對象。由於Date(NSDate)對象是特定時刻,我不得不爲每天想要獲取的日期創建「日期範圍」。CoreData獲取問題:獲取具有特定日期的數組的實體

我怎樣纔能有效地解決這個問題?我應該爲N天創建N個謂詞還是用「AND」子句創建一個大謂詞?有沒有巧妙的方法來實現這個共同的目標?

+1

'NSCoumpoundPredicate'應該是一個使用的,每天爲你想要的每一天創建一個OR謂詞,每天使用「date> = StartOfDay和date> = endOfDay」,並用OR組合它們。 – Larme

+0

確實使用複合謂詞結束。謝謝。 –

回答

1

如果你需要你的數據(所有事件)multipe時間,你不應該獲取他們的每個請求,更好地過濾它們。

例如:

var allEvents = [Events]() 

... 
let fetchRequest = NSFetchRequest(entityName: "events") 
allEvents = try context.executeFetchRequest(fetchRequest) as! [Event] 

然後,當你需要他們

1.特定日期

let calender = NSCalendar.currentCalendar() 
eventsForSelectedDay = events.filter({ return calender.isDate($0.yourDateProperty, inSameDayAsDate: self.currentSelectedDate) == true }) 

2.日期範圍

eventsForSelectedDays = events.filter({ return $0.yourDateProperty >= dateFrom && $0.yourDateProperty < dateTo }) 
+0

所以你會首先獲取所有實體,然後通過篩選特定範圍來獲取所需的選擇?聽起來不錯,但我搜索特定謂詞的原因是出於記憶的原因。有沒有像應該被提取到內存中的對象數量的門檻(側重於性能)?除此之外,很好的答案。 –

+0

isDate(_:inSameDayAsDate :):如果兩個NSDate實例在同一天返回true,則不需要對日期組件進行深入研究。你的例子是:'let filtered = events.filter {calendar.isDate($ 0.date,inSameDayAs:otherDate)}' –

+0

你從數據庫中獲取了多少事件? – derdida