使用 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 上以编程方式在线获取/更新谷歌日历数据