Сравнение NSPredicate и строк запросов Spotlight

Cocoa

Оба Spotlight и NSPredicate реализуют синтаксис строки запроса, и хотя они похожи,но все-же отличаются в нескольких отношениях. Одна строка запроса может быть преобразована в другие формы строки, до тех пор, пока используется общий набор функциональности.

Spotlight и NSPredicate

Нет особых существенных отношений между Spotlight и NSPredicate кроме того, что NSMetadataQuery является Cocoa интерфейсом Spotlight, и он использует NSPredicate в API. Синтаксис строки запроса похож, но отличается от синтаксиса строки запроса NSPredicate. Вы можете конвертировать одну строку запроса в другую форму строки, если вы используете общий набор функциональных синтаксисисов запроса, Spotlight в целом является более ограниченным, чем в NSPredicate.

Spotlight требует сопоставления положения, чтобы принять форму "KEY operator VALUE" и не принимает "VALUE operator KEY". Кроме того, принимаемое VALUE для Spotlight в виде атрибута более ограничено, чем принимаемое NSPredicate. В качестве частичного следствия этого ограничения, вы не всегда цитируете строки-литералы в Spotlight запросах. Можно опустить кавычки, когда значение является строкой, а не специальным оператором для применения к нему. Вы не можете сделать это с помощью строки запроса NSPredicate, результат будет неоднозначным.

Вы не можете использовать MDQuery оператор в качестве значения строки "KEY operator VALUE" объекта NSPredicate. Например, вы пишете выражение “есть-подстрока-из” в Spotlight следующим образом: "myAttribute = '*foo*'", в строке NSPredicate вы используете оператор contains, например: "myAttribute contains 'foo'". Spotlight используется глобально, как выражение, NSPredicate использует различные операторы.

Если вы используете "*" в левой стороне ключа в выражении сравнения, в Spotlight, это означает "любой ключ в пункте" и может быть использовано только с ==. Вы можете использовать это выражение в объекте NSPredicate только в сочетании с NSMetadataQuery объектом.

Создание строки формата предиката из поиска Spotlight в Finder

Вы можете создать строку формата предиката из поиска в Finder. Выполните поиск, сохранить его, а затем выберите папку, где вы его сохранили и выберите Свойства. Информационная панель показывает запрос, который используется Spotlight. Обратите внимание на то, что есть небольшие различия между строками формата NSPredicate и тем, что хранится в Finder. Строка поиска может выглядеть следующим образом.

(((* = "FooBar*"wcd) || (kMDItemTextContent = "FooBar*"cd))
    && (kMDItemContentType != com.apple.mail.emlx)
    && (kMDItemContentType != public.vcard))

Обычно все, что нужно сделать, чтобы преобразовать Spotlight запрос в строку формата предиката это убедиться, что предикат не начинается с * (это не поддерживается NSMetadataQuery при разборе предиката). Кроме того, если вы хотите использовать шаблон, вы должны использовать LIKE, как показано в следующем примере.

((kMDItemTextContent LIKE[cd] "FooBar")
    && (kMDItemContentType != "com.apple.mail.emlx")
    && (kMDItemContentType != "public.vcard"))
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac