2013-01-16 31 views
0

更新:我找到了答案,虽然可能还有更好的方法 - 请参阅下面添加的答案。为NSMetadataQuery匹配包含目标日期的kMDItemAccessedDates(数组)的NSPredicate?


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

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]]; 

想知道如果任何人有关于如何使这项工作任何想法...或者知道这是不可能的(如必须让他们全部,然后在记忆或其他事情做过滤器;真的希望不是这种情况 - 它可能是一个很长的名单!)。

回答

1

所以另一个几个小时挖成的互联网搜索结果,并试图东西,我有这个工作的排序

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\")

可能还有更好的办法,但我想我会把它放在这里,以防其他人在寻找任何线索。

+0

这很有趣。我以前没有见过CAST。我很高兴你能工作。 – regulus6633

0

好吧,我认为这是你想要的方法。我在查看kMDItemContentTypeTree属性的文件的文件夹上测试了这一点,这是一个类似于你的情况的字符串数组。基本上我将创建一个BEGINSWITH搜索,它将搜索该数组的值。

A BEGINSWITH搜索是一种LIKE搜索,除了搜索词在其末尾附加了“*”。我的想法是,你采用用户输入的日期,并使用技术来创建一个形式为“YYYY-MM-DD”的searchString,以获取我在其他帖子中显示的年/月/日。然后你用那种格式的值创建一个字符串。

现在你可以创建你的谓词并从你的userDateString中像这样开始查询。你会注意到我用%K插入了kMDItemAccessedDates属性。

NSString* userDateString = @"2013-01-15"; 

NSString* queryKeyString = @"kMDItemAccessedDates"; 
NSString* searchDate = [userDateString stringByAppendingString:@"*"]; 
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"%K like %@", queryKeyString, searchDate]; 

// folderQuery is your NSMetadataQuery 
[folderQuery setSearchScopes:[NSArray arrayWithObject:folderPath]]; // the folder you want to search 
[folderQuery setPredicate:predicate]; 
[folderQuery startQuery]; 
+0

嘿,现在* *很聪明!我被他们当成了日期,但事实上他们也是字符串,正如你指出的那样。我会试试这个。 – Dad

+0

呵呵。无法得到这个工作。我有这样的kMDItemAuthors工作,这是一个字符串数组,所以我想知道它是否不工作,因为它们是日期...尝试开始也只是为了防万一(没有添加“*”),不工作。 – Dad