使用 EventKit 对 iOS 日历进行文本搜索

Posted

技术标签:

【中文标题】使用 EventKit 对 iOS 日历进行文本搜索【英文标题】:Text Search for iOS Calendar using EventKit 【发布时间】:2021-08-26 13:53:02 【问题描述】:

我需要在 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 条件(以及如何定义?)并将其用于日历搜索吗?一些消息来源暗示这可能是可能的,但我没有看到任何对我有帮助的例子。或者是因为日期过滤器是唯一可以以这种方式使用的过滤器,并且必须在第二次迭代中检查其他条件?

最有效的方法是什么?

【问题讨论】:

【参考方案1】:

事件工具包的events(matching:) 方法只接受由事件工具包方法创建的谓词。如果你通过一个自定义的NSPredicate 喜欢。

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

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

events = store.events(matching: aPredicate).filter( $0.title.contains("search text") )

【讨论】:

【参考方案2】:

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

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

出于性能原因,此方法仅匹配四年时间跨度内的那些事件。如果 startDate 和 endDate 之间的日期范围大于四年,则会缩短到前四年。

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

【讨论】:

以上是关于使用 EventKit 对 iOS 日历进行文本搜索的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS EventKit 上以编程方式在线获取/更新谷歌日历数据

EventKit 日历的最后一个事件

将 EventKit 事件与远程数据库同步

使用 EventKit 添加事件和日历

如何使用 EventKit (Calendar) 集成并仍然支持 iOS 3.x (MonoTouch)?

Swift 4.0 Eventkit 无法正确获取日历和事件