使用 EventKit 文本搜索 iOS 日历

Text Search for iOS Calendar using EventKit

我需要在 iOS 设备日历中搜索在事件注释中包含给定文本的日历事件。 Apple 描述了日期过滤器的此过程,其中过滤条件在 NSPredicate 实例中定义 - 如以下示例(来自 https://developer.apple.com/documentation/eventkit/retrieving_events_and_reminders#overview)和我能找到的许多其他示例。

var predicate: NSPredicate? = nil
if let anAgo = oneDayAgo, let aNow = oneYearFromNow {
    predicate = store.predicateForEvents(withStart: anAgo, end: aNow, calendars: nil)
}
var events: [EKEvent]? = nil
if let aPredicate = predicate {
    events = store.events(matching: aPredicate)

现在,我不关心日期 - 我实际上想在数据库中搜索所有日期。我想检索所有事件,包括过去和未来的所有日期,例如事件注释中的文本“我的搜索文本”。我可以定义相应的 NSPredicate 条件(以及如何定义?)并将其用于日历搜索吗?一些消息来源暗示这可能是可能的,但我还没有看到任何对我有帮助的例子。还是日期过滤器是唯一可以以这种方式使用的过滤器,并且必须在第二次迭代中检查其他条件?

最有效的方法是什么?

Event kit 的 events(matching:) 方法只接受由 event kit 方法创建的谓词。如果你传递自定义 NSPredicate like.

store.events(matching: NSPredicate(format: "title CONTAINS[cd] %@", "search text"))

它会崩溃。一种可能的解决方案是在获取所有事件后应用过滤器。

events = store.events(matching: aPredicate).filter({ [=11=].title.contains("search text") })

Aravind Vijayan 发布了对主要问题的完美回答。只能按开始日期和结束日期搜索事件数据库。在给定范围内,然后可以按其他标准过滤结果。关于我的问题中的“我实际上想搜索数据库中的所有日期”,我想补充几点:

  1. 需要开始和结束日期,这意味着无法搜索“所有日期”。遗憾的是没有其他标准可以搜索。
  2. documentation for predicateForEvents() 表示最大的时间间隔。 4年可以查。如果想要涵盖更大的时间范围,则需要将其分成多个 4 年的时间段。

For performance reasons, this method matches only those events within a four-year time span. If the date range between startDate and endDate is greater than four years, it’s shortened to the first four years.

  1. 搜索returns 完全或部分在给定时间间隔内的所有事件。这意味着在搜索连续时间间隔时需要一些防止重复的预防措施,即删除相同事件 ID 的重复项。
  2. 搜索returns给定时间间隔内重复事件的所有实例。都具有相同的事件 ID。