2017-08-23 51 views
1

我有一個NSTableview可以獲取核心數據的日期。 在我的實體中是Date類型的屬性。NSPredicate - 使用日期屬性搜索

現在我想實現一個搜索功能。 爲此,我有這樣的代碼:

@IBAction func search(_ sender: NSSearchField) { 
    let predicate : NSPredicate? 
     if sender.stringValue.isEmpty { 
     predicate = nil 
     } else { 
     predicate = // ? 
     } 
    requestData(predicate: predicate) 
} 

但我不知道該怎麼謂詞必須是,如果我用屬性Date

例如過濾我的結果:

  • 搜索字段值= 01.12 =>顯示核心數據日期的所有數據01.12.xxxx
  • 搜索字段值= 12.2017 =>顯示核心數據日期的所有數據xx.12.2017
  • 搜索字段值= 2017年=>顯示所有數據,其中核心數據日期xx.xx.2017

我希望你明白我的問題,你能不能幫我:)

回答

0

正如它已經提到這是一個棘手的情況。但我相信它可以做到。 正如Alex建議的那樣,您可以使用DateComponents進行比較並查找所需的日期。但要做到這一點,您應該在CoreData表的數據模型類中定義附加變量。示例:

var calendar = Calendar(identifier: .gregorian) 
var openDateComponents: DateComponents { 
    return calendar.dateComponents([.year, .month, .day], from: openTime! as Date) 
} 

不幸的是,您不能將其用作謂詞。但是這個已定義的變量將允許您在從表中獲取數據後使用它。您可以使用循環輕鬆實現過濾。所以我建議你這樣去:

  1. 在你的數據模型類中定義變量。這將允許您在獲取數據後過濾掉提取的結果。

  2. 實現謂詞的附加邏輯。這將允許您最小化從數據庫表中提取的記錄數。

例如: 輸入字符串是06.2017(MM.YYYY)。你可以轉換到這個使用DateFormatter類型爲Date的兩個變量(NSDate的),然後使用兩個變量作謂語:

request.predicate = NSPredicate(format: "someDate > %@ and somedate < %@", inputDateStart as NSDate, inputDateEnd) 

因此,這隻會幫助你減少將從表拉到記錄數。但如果輸入字符串像12.02.XXXX,這不會幫助你。

0

如果您用於日期日期類型,可以將日期分成DateComponents:

let date = Date() 
let calendar = Calendar(identifier: .gregorian) 
let components = calendar.dateComponents([.year, .month, .day], from: date) 

print(components.day, components.month, components.year) 

然後,你可以通過這些組件簡單地比較和篩選。

0

我想你會遇到一些問題,試圖使用NSSearchField來搜索日期,將用戶輸入的內容轉化爲可行的對象將涉及一大塊邏輯,這個快速示例將是來自美國的用戶輸入2017年2月8日意味着2017年2月2日與歐洲公民相比,意思是2017年8月2日。

還有一個用戶將「Last Thursday」之類的內容綁定到搜索字段並翻譯變成一個Date對象。

我對此的建議是實施某種排序的UI控件,如日期選擇器,它可以很容易地將用戶輸入轉換爲可行的對象Date

這且不說,你可以構建通過以下操作使用日期對象謂詞:

let now: Date = Date()   
let predicate: NSPredicate = NSPredicate(format: "date < %@", now as NSDate) 

我希望幫助。