Сравнение 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"))