更新:我找到了答案,尽管可能还有更好的方法 - 请参阅下面添加的答案。
<小时/>聚光灯导入器导入元数据,该元数据是访问项目的日期数组。看起来像这样:
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/