NSPredicate - 使用日期属性搜索

时间:2017-08-23 15:09:57

标签: swift macos core-data

我有一个NSTableview,它获取核心数据的日期。 在我的实体中是Date类型的属性。

现在我想实现一个搜索功能。 为此,我有这个代码:

@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
  • 的所有数据

等等

我希望你理解我的问题,你可以帮助我:)。

3 个答案:

答案 0 :(得分: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)

然后您可以简单地比较和过滤这些组件。

答案 1 :(得分:0)

我认为您尝试使用NSSearchField搜索日期会遇到一些问题,因为将用户输入的内容转换为可行的Date对象将涉及一大块逻辑一个简单的例子就是来自美国的用户输入2017年2月2日的2017年2月2日与2017年8月2日的欧洲公民打字。

还有一个问题是用户绑定的内容如上周四"进入搜索字段并将其转换为Date对象。

我的建议是实现一些排序UI控件,例如日期选择器,可以轻松地将用户输入转换为可用的Date对象。

除此之外,您可以通过执行以下操作来构造使用日期对象的谓词:

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

我希望有所帮助。

答案 2 :(得分:0)

如前所述,这是一个棘手的案例。但我相信它可以做到。 正如Alex建议的那样,您可以使用DateComponents来比较和查找所需的日期。但要执行此操作,您应该在CoreData表的数据模型类中定义其他变量。例如:

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

不幸的是,你不能将它用作谓词。但是这个定义的变量将允许您在从表中获取数据后使用它。您可以使用循环轻松实现过滤。所以我建议你这样走:

  1. 在数据模型类中定义变量。这将允许您在获取数据后过滤掉提取的结果。

  2. 为谓词实现其他逻辑。这将允许您最小化从数据库表中提取的记录数。

  3. 例如: 输入字符串为06.2017(MM.YYYY)。您可以使用DateFormatter将其转换为类型为Date(NSDate)的两个变量,然后将这两个变量用作谓词:

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

    因此,这只会帮助您减少将从表中提取的记录数。但是如果输入字符串类似于12.02.XXXX,这对你没用。