Предикат. Основы.

Cocoa

Основы

Предикат является логическим оператором, который возвращает логическое значение (истина или ложь). Есть два типа предикатов; предикаты сравнения, и составные предикаты:

Предикат сравнения сравнивает два выражения с помощью оператора. Выражения указываются с левой стороны, а с правой - предикат (с оператором в середине). Предикат сравнения возвращает результат вызова оператора с результатами оценки выражений.

Составной предикат сравнивает результаты оценки двух или более других предикатов, или сводит на нет другой предикат.

Cocoa поддерживает широкий диапазон типов предикатов, включая следующие:

  • Простое сравнение, например, grade == 7 или firstName like 'Mark'
  • Регистро или диакритически нечувствительный поиск, такой как: name contains[cd] 'citroen'
  • Логические операции, такие как: (firstName beginswith 'M') AND (lastName like 'Adderley')

Вы также можете создать предикаты для отношения, такие как: group.name matches 'work.*', ALL children.age > 12, и ANY children.age > 12 и для таких операций, как @sum.items.price < 1000.

Cocoa предикаты дают возможность кодирования запросов таким образом, который не зависит от сохранения, используемых для хранения данных поиска. Вы можете использовать предикаты представляющие логические условия, используемые для ограничения набора объектов извлекаемых из Spotlight и Core Data, и для фильтрации объектов в памяти.

Вы можете использовать предикаты с любым классом объекта, но обратите внимание, что класс должен быть совместимым для кодирования ключ-значение, для ключей, которые вы хотите использовать в предикате

Классы предикатов

Cocoa содержит три предикат класса: NSPredicate и два подкласса NSComparisonPredicate и NSCompoundPredicate.

NSPredicate предусматривает, среди прочего, методы оценки предиката, и создание предиката из строки (например, firstName like 'Mark'). Во многих случаях вы просто используете NSPredicate. При создании предиката, используя строку, NSPredicate создает соответствующие экземпляры предиката и выражения для вас. В некоторых ситуациях вы захотите создать сравнения или соединения предикатов, в этом случае вы можете использовать NSComparisonPredicate и NSCompoundPredicate напрямую.

Выражения предикатов в Cocoa представлены экземплярами NSExpression. Самое простое выражение просто представляет собой постоянную величину. Часто, однако, можно использовать выражения, получающие значение для ключа пути к объекту, в настоящее время оцениваемого в предикате. Вы также можете создать выражения для представления объекта, в настоящее время оцениваемого в предикате, чтобы использовать в качестве заполнителя для переменной или возвращаемого результата проведения операции по массиву.

Как создать предикаты и выражения обсуждается более подробно в разделе "Создание предикатов".

Пределы и ограничения

Если вы используете предикаты с Core Data или Spotlight, вы должны позаботиться о том, что они будут работать с соответствующим хранилищем данных. Не существует никакой конкретной реализации языка для предикатных запросов, запрос предиката может быть переведен на SQL, XML, или другой формат, в зависимости от требований резервного хранилища (если, конечно, есть).

Система предикатов предназначена для поддержки разумного диапазона операторов, так что не предусматривается возможность объединения всего множества операторов для применения ко всему множеству возможных объектов. Поэтому не все возможные запросы предикатов поддерживаются всеми хранилищами объектов, и не все операции, поддерживаемые всеми хранилищами объектов могут быть выражены через NSPredicate и NSExpression. С другой стороны, может уронить предикат (например, он может сделать сравнение одновременно с учетом регистра и без учета регистра) или вызвать исключение, если вы пытаетесь использовать неподдерживаемый оператор. Например:

  • matches оператор, использующий regex, так как не поддерживается Core Data SQL -хотя работает с фильтрацией в памяти.
  • Core Data SQL поддерживает только одну ко многим операцию на запрос, поэтому в любом предикате, отправляющем в хранилище SQL, может быть только один оператор (и один экземпляр этого оператора) с ALL, ANY, и IN.
  • Вы не можете просто перевести "произвольный" SQL запрос в предикаты.
  • Оператор ANYKEY может использоваться только со Spotlight.
  • Spotlight не поддерживает отношения.
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac