2013-01-16 4 views
0

업데이트 : 더 나은 방법이 있을지 모르지만 나는 아래 답변을 보았습니다.대상 날짜가 포함 된 kMDItemAccessedDates (배열)와 NSMetadataQuery의 NSPredicate (s)가 일치합니까?


스포트라이트 가져 오기 도구는 항목에 액세스 한 날짜 배열 인 메타 데이터를 가져옵니다. 다음과 같습니다 : 나는 사용자가 입력 특정 날짜에 액세스 된 그러나 나는이 작업을 수행 할 수있는 권리 구문을 찾는 게 아니에요 이러한 파일을 쿼리하고 싶습니다

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 {%@, %@}" ... 여전히 예외를 던지는 데 도움이되지 않았습니다.

이를 시도하고 예외를 throw하지,하지만 정말 하나 작동하지 않습니다 : 사람이 일을하는 방법에 어떤 아이디어가 있는지 궁금

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 검색을 만들고 배열의 값을 검색합니다.

BEGINSWITH 검색은 검색 단어에 "*"가 끝에 붙는 것을 제외하고는 모두 LIKE 검색입니다. 내 생각은 사용자 입력 날짜를 가져 와서 "YYYY-MM-DD"형식의 searchString을 만드는 기술을 사용하여 다른 게시물에서 보여준 연도/월/일을 얻는 것입니다. 그런 다음 해당 형식의 값으로 문자열을 만듭니다.

이제 사용자 정의 술어를 작성하고 userDateString에서 이와 같이 조회를 시작할 수 있습니다. kMDItemAccessedDates 속성을 삽입하기 위해 % K를 사용했음을 알 수 있습니다.

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에 대한 workign과 같은 것을 가지고 있기 때문에 날짜가 있기 때문에 여기에서 작동하지 않을지 궁금해하고 있습니다 ... 시도해 볼 수도 있습니다 ("*"를 추가하지 않은 경우), 작동하지 않습니다. – Dad