使用 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 发布了对主要问题的完美回答。只能按开始日期和结束日期搜索事件数据库。在给定范围内,然后可以按其他标准过滤结果。关于我的问题中的“我实际上想搜索数据库中的所有日期”,我想补充几点:
- 需要开始和结束日期,这意味着无法搜索“所有日期”。遗憾的是没有其他标准可以搜索。
- 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.
- 搜索returns 完全或部分在给定时间间隔内的所有事件。这意味着在搜索连续时间间隔时需要一些防止重复的预防措施,即删除相同事件 ID 的重复项。
- 搜索returns给定时间间隔内重复事件的所有实例。都具有相同的事件 ID。
我需要在 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 发布了对主要问题的完美回答。只能按开始日期和结束日期搜索事件数据库。在给定范围内,然后可以按其他标准过滤结果。关于我的问题中的“我实际上想搜索数据库中的所有日期”,我想补充几点:
- 需要开始和结束日期,这意味着无法搜索“所有日期”。遗憾的是没有其他标准可以搜索。
- 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.
- 搜索returns 完全或部分在给定时间间隔内的所有事件。这意味着在搜索连续时间间隔时需要一些防止重复的预防措施,即删除相同事件 ID 的重复项。
- 搜索returns给定时间间隔内重复事件的所有实例。都具有相同的事件 ID。