【问题标题】:Text Search for iOS Calendar using EventKit使用 EventKit 对 iOS 日历进行文本搜索
【发布时间】: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 条件(以及如何定义?)并将其用于日历搜索吗?一些消息来源暗示这可能是可能的,但我没有看到任何对我有帮助的例子。或者是因为日期过滤器是唯一可以以这种方式使用的过滤器,并且必须在第二次迭代中检查其他条件?

最有效的方法是什么?

【问题讨论】:

    标签: ios swift calendar nspredicate ekeventkit


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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多