swift - NSPredicate - 使用日期属性搜索

标签 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 的所有数据

等等

我希望你能理解我的问题并能帮助我:)

最佳答案

如前所述,这是一个棘手的案例。但我相信这是可以做到的。 正如 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,这将无济于事。

关于swift - NSPredicate - 使用日期属性搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45843443/

相关文章:

ios - 关于身份验证问题的快速状态代码 401

swift - 从 Swift 3 中的自定义键盘打开包含应用程序?

swift - 如何在 Swift 中向实体插入新数据?

ios5 - MagicalRecord iCloud 备份

ios - @EnvironmentObject 可以与不是 View 的普通结构一起使用吗?

ios - 如何在 Swift 中测试变量的类?

macos - 在Mac中计算目录及其子目录的特定文件类型的数量

javascript - MEAN 堆栈 docker 容器在 OS X 和 DigitalOcean 上具有相同配置的最简单设置是什么?

linux - Bash Printf 格式不正确

ios - 如何使用 Swift 中的核心数据正确映射一对多关系?尝试期间出现 NSInvalidArgumentException 错误