更新:まだ良い方法があるかもしれませんが、答えを見つけました-以下に追加された答えを参照してください。
Spotlight インポーターは、アイテムがアクセスされた日付の配列であるメタデータをインポートします。次のようになります。
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]];
誰かがこれを機能させる方法についてアイデアを持っているかどうか疑問に思っています...またはそれが不可能であることを知っています(それらをすべて取得してからメモリ内でフィルタを実行する必要があるなど)。そうでないことを本当に願っています-長いリストになる可能性があります!)。