objective-c - NSMetadataQuery 的 NSPredicate 是否匹配包含目标日期的 kMDItemAccessedDates (数组)?

标签 objective-c cocoa nspredicate spotlight nsmetadataquery

更新:我找到了答案,尽管可能还有更好的方法 - 请参阅下面添加的答案。

<小时/>

聚光灯导入器导入元数据,该元数据是访问项目的日期数组。看起来像这样:

kMDItemAccessedDates               = (
    "2012-06-18 07:00:00 +0000",
    "2013-01-10 08:00:00 +0000",
    "2013-01-15 08:00:00 +0000"
)

我想查询在用户输入的特定日期访问过的任何文件,但我找不到执行此操作的正确语法。想知道是否可以这样做...

第一个问题是用户输入的日期代表的是一天,而不是日期和时间。

似乎我需要搜索当天的任何日期,所以从逻辑上讲:ADATE >= user_day_start && ADATE <= user_day_end

现在元数据中有一个日期数组,因此我真的希望它能够匹配其中任何日期是否属于 user_date 日。

如果这有效的话,请表现得友善一点:

NSDate * date = [NSDate dateWithNaturalLanguageString: inWhenString];
NSDate * endDate = [NSDate dateWithTimeInterval: 86400 sinceDate: date];

predicate = [NSPredicate predicateWithFormat: 
              @"kMDItemAccessedDates between {%@, %@}", date, endDate];

但这会引发异常:

Exception detected while handling key input.
2013-01-16 03:12:57.517 Chatty[96974:403] Unknown type of NSComparisonPredicate 
  given to NSMetadataQuery 
  (kMDItemAccessedDates BETWEEN {CAST(379540800.000000, "NSDate"),
  CAST(379627200.000000, "NSDate")}) 

并且似乎它可能只适用于单个日期而不是数组。将“ANY”添加到格式字符串中,如下所示:"ANY kMDItemAccessedDates between {%@, %@}" ...没有帮助,仍然抛出异常。

尝试过这个,它没有抛出异常,但也没有真正起作用:

NSPredicate *p1 = [NSPredicate predicateWithFormat: @"kMDItemAccessedDates >= %@", date ];
NSPredicate *p2 = [NSPredicate predicateWithFormat: @"kMDItemAccessedDates <= %@", endDate ];
predicate = [NSCompoundPredicate andPredicateWithSubpredicates: [NSArray arrayWithObjects: p1, p2, nil]];

想知道是否有人对如何实现这项工作有任何想法......或者知道这是不可能的(比如必须获得所有这些,然后在内存中进行过滤或其他操作;真的希望情况并非如此 - 可能是一长串!)。

最佳答案

因此,又花了几个小时深入研究互联网搜索结果并尝试一些东西,我有点已经成功了。

NSDate * userDate = [NSDate dateWithNaturalLanguageString: inWhenString];
NSDateComponents * userDateComponents = [[NSCalendar currentCalendar] components: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate: userDate];
NSDate * dayDate = [[NSCalendar currentCalendar] dateFromComponents: userDateComponents];
dNSLog(@"date %@", dayDate );
NSString * formatStr = [NSDateFormatter dateFormatFromTemplate: @"yyyy-MM-dd" options: 0 locale: nil];
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat: formatStr];

NSString * dayStr = [formatter stringFromDate: dayDate];
dayStr = [dayStr stringByAppendingString: @"*"];
dNSLog(@"dayString: %@", dayStr );
NSPredicate *p1 = [NSPredicate predicateWithFormat: @"%K >= CAST(%f, \"NSDate\")", @"kMDItemAccessedDates", [dayDate timeIntervalSinceReferenceDate] ];
NSPredicate *p2 = [NSPredicate predicateWithFormat: @"%K <= CAST(%f, \"NSDate\")", @"kMDItemAccessedDates", [dayDate timeIntervalSinceReferenceDate] + 86400.0f ];
predicate = [NSCompoundPredicate andPredicateWithSubpredicates: @[p1, p2]];

整个方法可能存在其他问题(基于应用程序如何更新该日期数组),可能需要我完全做其他事情,但这似乎回答了最初的问题:如何仅获取已包含的项目在特定日期访问。

我相信关键是CAST(%f,\"NSDate\")

可能还有更好的方法,但我想我应该把它放在这里,以防其他人正在挖掘任何线索。

关于objective-c - NSMetadataQuery 的 NSPredicate 是否匹配包含目标日期的 kMDItemAccessedDates (数组)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14357577/

相关文章:

ios - UICollectionView 自定义单元格在我滚动时自动刷新

c# - stringWithFormat "%.16f"是什么意思?

objective-c - NSPredicate 对一个查询字符串进行多次比较

ios - 使用 NSPredicate 过滤年/月的 fetchRequest

ios - 我如何设置一个 NSPredicate 来总结 iOS 字典数组中字典中的属性值?

objective-c - ios将objc指针转换为struct cgcolorref

iOS 无法加载图像文件以编程方式从 View Controller 查看

objective-c - 名为 'description' 的属性导致崩溃

objective-c - 使用 Objective-C/Cocoa 平面命名空间

iphone - 我的自定义类及其实例存在问题