Сравнение NSPredicate и строк запроса центра внимания
Оба центра внимания и NSPredicate
класс реализует синтаксис строки запроса, и хотя они подобны, они отличаются по нескольким отношениям. Одна строка запроса может быть преобразована в другую строковую форму, пока используется общее подмножество функциональности.
Центр внимания и NSPredicate
NSMetadataQuery
класс, который является интерфейсом Cocoa для Развертки бегущим лучом, использование NSPredicate
в его API. Кроме этого, нет никакого отношения между Центром внимания и NSPredicate
. Синтаксис строки запроса Центра внимания подобен, но отличается от, NSPredicate
синтаксис строки запроса. Можно преобразовать одну строку запроса в другую строковую форму, пока Вы используете синтаксис, который понимает оба APIs. Синтаксис запроса центра внимания является подмножеством того из NSPredicate
. Поскольку полное описание Центра внимания запрашивает синтаксис выражения, посмотрите Синтаксис выражения Запроса Метаданных Файла, и для полного описания NSPredicate
строковый синтаксис, посмотрите Синтаксис Строки формата Предиката.
Центр внимания требует, чтобы пункты сравнения приняли форму "KEY operator VALUE"
и не принимает "VALUE operator KEY"
. Кроме того, виды Центра внимания атрибута принимает для VALUE
более ограничены, чем принятые NSPredicate
. Как частичное последствие этого ограничения, необходимо не всегда заключать литеральные строки в кавычки в запросах Центра внимания. Можно опустить кавычки когда VALUE
строка, и никакие специальные операторы не должны быть применены к ней. Вы не можете сделать этого с NSPredicate
строка запроса, поскольку результат был бы неоднозначен.
Синтаксис для обозначения случая - и диакритическая нечувствительность для запросов в Центре внимания отличается от NSPredicate
версия. В Центре внимания Вы добавляете маркеры до конца строки сравнения (например, "myAttribute == 'foo'cd"
). В NSPredicate
строки, Вы используете like
оператор и префикс маркеры в» [] «s (например, "myAttribute like[cd] 'foo'"
). В обоих случаях, 'cd'
означает нечувствительный к регистру и нечувствительный к диакритическому знаку. Центр внимания помещает модификаторы на значение, NSPredicate
помещает модификаторы на оператора.
Вы не можете использовать MDQuery
оператор как VALUE
из NSPredicate
объект "KEY operator VALUE"
строка. Например, Вы пишете, что выражение «является подстрокой» в Центре внимания как это: "myAttribute = '*foo*'"
; в NSPredicate
строки Вы используете contains
оператор, как это: "myAttribute contains 'foo'"
. Центр внимания берет подобные шарику выражения, NSPredicate
использует различного оператора.
Если Вы используете “*
” как ключ левой стороны в выражении сравнения, в Центре внимания это означает “любой ключ в элементе” и может только использоваться с ==
. Вы могли только использовать это выражение в NSPredicate
объект в сочетании с NSMetadataQuery
объект.
Создание строки формата предиката от поиска центра внимания в средстве поиска
Можно создать строку формата предиката из поиска в Средстве поиска. Выполните поиск, сохраните его, затем выберите папку, где Вы сохранили его, и выберите Show Info — Информационные телевикторины запрос, использующийся Центром внимания. Отметьте, однако, что существуют незначительные различия между NSPredicate
строка формата и та сохранены в Средстве поиска. Строка Средства поиска могла бы быть похожей на следующий пример.
(((* = "FooBar*"wcd) || (kMDItemTextContent = "FooBar*"cd)) |
&& (kMDItemContentType != com.apple.mail.emlx) |
&& (kMDItemContentType != public.vcard)) |
Обычно все, что необходимо сделать для преобразования запроса Центра внимания в строку формата предиката, удостоверяются, что предикат не запускается с *
(это не поддерживается NSMetadataQuery
при парсинге предиката). Кроме того, когда Вы хотите использовать подстановочный знак, необходимо использовать LIKE
, как показано в следующем примере.
((kMDItemTextContent LIKE[cd] "FooBar") |
&& (kMDItemContentType != "com.apple.mail.emlx") |
&& (kMDItemContentType != "public.vcard")) |