Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека Разработчика iOS

Разработчик

Ссылка платформы CloudKit ссылка класса CKQuery

Опции
Развертывание Target:

На этой странице
Язык:

CKQuery

Наследование


Оператор импорта


Swift

import CloudKit

Objective C

@import CloudKit;

Доступность


Доступный в iOS 8.0 и позже.

A CKQuery объект управляет критериями для применения при поиске записей в базе данных. Вы создаете объект запроса как первый шаг в поисковом процессе. Объектно-ориентированные памяти запроса поисковые параметры, включая тип записей на поиск, критерии соответствия (предикат) для применения, и параметры вида для применения к результатам. Второй шаг должен использовать объект запроса инициализировать a CKQueryOperation объект, который Вы тогда выполняете для генерации результатов.

Всегда определяйте тип записи и предикат при создании объекта запроса. Тип записи сужает объем поиска к одному типу записи, и предикат определяет условия, для которых записи того типа считают соответствием. Предикаты обычно сравнивают одно или более полей записи на постоянные значения, но можно создать предикаты, возвращающие все записи данного типа или выполняющие более детальные поиски.

Поскольку тип записи и предикат не могут быть изменены позже, можно использовать то же CKQuery объект инициализировать многократный CKQueryOperation объекты, каждый из которых предназначается для различной базы данных или зоны.

Создание Ваших предикатов

NSPredicate объект определяет логические условия для определения, достойна ли запись запроса. CKQuery класс поддерживает только подмножество способов поведения предиката, предлагаемых полным NSPredicate класс.

Правила предиката для объектов запроса

Предикаты, которые Вы создаете для своих объектов запроса, должны соблюсти эти правила:

  • Предикаты основываются на строке формата. Вы не можете использовать значение или основанные на блоке предикаты.

  • Предикаты используют только операторов, перечисленных в Таблице 1.

  • Предикаты воздействуют только на поля, содержащие следующие типы данных:

  • Ключевые имена, используемые в предикатах, соответствуют полям в в настоящее время оцениваемой записи. Ключевые имена могут включать имена свойств метаданных записи такой как»creationDate” или любые поля данных Вы добавили к записи. Вы не можете использовать ключевые пути для указания полей в связанных записях.

  • Предикаты поддерживают следующие строки подстановки переменных:

    • Использовать %@ для объектов значения, таких как строки, числа и даты.

    • Использовать %K для имени поля. Эта переменная замены указывает, что строка, которой заменяют, должна использоваться для поиска имени поля.

  • За одним исключением, CONTAINS оператор может использоваться только для тестирования членства в списке. Исключение - при использовании его для выполнения полнотекстовых поисков в сочетании с self ключевой путь. self ключевой путь заставляет сервер выглядеть в доступных для поиска основанных на операция со строками полях для указанной строки маркера. Например, строка предиката @"self contains 'blue'" поиски слова, «синего» во всех полях, отмечены для включения в полнотекстовые поиски. Вы не можете использовать self ключевой путь для поиска в полях, тип которых не является строкой.

  • ANY и SOME агрегатные операторы могут быть объединены с IN и CONTAINS операторы для выполнения тестов членства в списке.

  • distanceToLocation:fromLocation: функция оператора выполняет основанное на радиусе сравнение расположения, и то сравнение должно определить, является ли значение расположения в круговой области, которую Вы обеспечиваете. Вы не можете использовать его для поиска расположений за пределами указанной круговой области.

  • ALL агрегатный оператор не поддерживается.

  • NOT составной оператор не поддерживается в следующих случаях:

    • Вы не можете использовать его для отрицания AND составной предикат.

    • Вы не можете использовать его в маркируемых запросах такой как self CONTAINS 'value'.

    • Вы не можете использовать его с distanceToLocation:fromLocation: функция.

    • Вы не можете использовать его в BETWEEN запросы.

Поддерживаемые операторы предиката

Таблица 1 перечисляет операторов, которых можно использовать в предикатах, связанных с a CKQuery объект.

Табличные 1Supported операторы предиката

Работа

Поддерживаемые операторы

Основные сравнения

=, ==

>=, =>

<=, =<

<

>

!=, <>

BETWEEN

Предикаты булева значения

TRUEPREDICATE

FALSEPREDICATE

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

AND, &&

NOT

Сравнения строк

BEGINSWITH

Совокупные операции

IN

CONTAINS

Функции

distanceToLocation:fromLocation:

Указание неподдерживаемого оператора или типа данных в предикате Вашего запроса приводит к ошибке при выполнении запроса. Для получения дополнительной информации о создании объектов предиката, см. Руководство по программированию Предиката.

Демонстрационные строки формата предиката

Для соответствия записей, соединяющихся с различной записью, ID которой Вы знаете создайте предикат, соответствующий поле, содержащее ссылочный объект как показано в Перечислении 1. В примере, employee поле записи содержит a CKReference возразите что точки против другой записи. Когда запрос выполняется, соответствие происходит когда ID в локально создаваемый CKReference объектом является тот же ID, найденный в указанном поле записи.

Перечисление 1Matching ID записи
  • CKReference* recordToMatch = [[CKReference alloc] initWithRecordID:employeeID action:CKReferenceActionNone];
  • NSPredicate* predicate = [NSPredicate predicateWithFormat:@"employee == %@", recordToMatch];

Для соответствия содержания поля к определенному значению используйте предикат, подобный тем показанным в Перечислении 2. Все перечисленные предикаты генерируют тот же набор результатов, в примере означающий что favoriteColors поле содержит значение red. Значение в поле должно соответствовать значение, которое Вы указываете в предикате точно. Основанные на операция со строками сравнения нечувствительны к регистру, но иначе все сравнения должны быть точным совпадением указанного значения.

Перечисление 2Matching поле к определенному значению
  • NSPredicate predicate = nil;
  • predicate = [NSPredicate predicateWithFormat:@"ANY favoriteColors = 'red'"];
  • predicate = [NSPredicate predicateWithFormat:@"favoriteColors CONTAINS 'red'"];
  • predicate = [NSPredicate predicateWithFormat:@"'red' IN favoriteColors"];
  • predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS %@", @"favoriteColors", @"red"];

Можно соответствовать против больше чем одного значения за один раз при помощи предиката, подобного тем в Перечислении 3. В примере предикаты сообщают о соответствии если значение в favoriteColor поле записи соответствует любое из значений red или green.

Перечисление 3Matching поле к одному или более значениям
  • NSPredicate predicate = nil;
  • predicate = [NSPredicate predicateWithFormat:@"ANY { 'red', 'green' } = favoriteColor"];
  • predicate = [NSPredicate predicateWithFormat:@"favoriteColor IN { 'red', 'green' }"];

Для полей, содержащих строковые значения, можно соответствовать начинающуюся часть строки с помощью BEGINSWITH оператор как показано в Перечислении 4. Вы не можете использовать других операторов сравнения строк такой как CONTAINS или ENDSWITH. При использовании этого оператора поле должно содержать строковое значение и должно запуститься со строки, которую Вы указали. Соответствия нечувствительны к регистру. В примерах предикат соответствует записи чей favoriteColors поле содержало строки red, reddish, или red green duct tape.

Перечисление 4Matching поле, запускающееся со строкового значения
  • NSString* matchString = @"red";
  • NSPredicate predicate = nil;
  • predicate = [NSPredicate predicateWithFormat:@"ANY favoriteColors BEGINSWITH 'red'"]
  • predicate = [NSPredicate predicateWithFormat:@"ANY favoriteColors BEGINSWITH %@", matchString]

Для выполнения маркируемого поиска полей записи используйте специальный оператор self. Маркируемый поиск ищет любые поля, которым включили полнотекстовый поиск, который является всеми основанными на операция со строками полями по умолчанию. Перечисление 5 показывает пример, ищущий поля записи для строк маркера bob и smith. Каждое отличное слово обрабатывается как отдельный маркер в целях поиска. Сравнения являются случаем - и нечувствительный к диакритическому знаку. Эти строки маркера могут быть найдены в единственном поле или в многократных полях, но все маркеры должны присутствовать в записи для него, чтобы считаться соответствием.

Перечисление 5Matching поле, содержащее маркируемую строку
  • NSPredicate predicate = nil;
  • predicate = [NSPredicate predicateWithFormat:@"self contains 'bob smith'"];

Чтобы протестировать, являются ли два расположения друг около друга, создайте предикат с помощью distanceToLocation:fromLocation: функционируйте как показано в Перечислении 6. Предикатам, использующим эту функцию, нужно было показать структуру в перечислении. В Вашем коде замените location переменная с именем поля от одной из Ваших записей. (Этот тип данных для поля должен быть a CLLocation объект.) Точно так же заменяют fixedLoc и radius значения с надлежащими значениями из Вашего приложения. fixedLoc значение является географической координатой, отмечающей центр круга с указанным радиусом. Если расположение в записи в 10 километрах указанной широты и долготы, в этом примере предикат возвращает соответствие.

Перечисление 6Matching расстоянием от расположения
  • CLLocation* fixedLoc = [[CLLocation alloc] initWithLatitude:37.331913 longitude:-122.030210];
  • CGFloat radius = 10000; // meters
  • NSPredicate predicate =
  • [NSPredicate predicateWithFormat:@"distanceToLocation:fromLocation:(location, %@) < %f", fixedLoc, radius]];

Для получения всех записей данного типа используйте TRUEPREDICATE выражение как показано в Перечислении 7. Предикат с этим оператором всегда оценивает к истине и таким образом соответствует каждую запись. При использовании такого оператора рекомендуется использовать курсор для пакетной обработки результатов в меньшие группы для обработки.

Перечисление 7Retrieving все записи данного типа
  • NSPredicate predicate = nil;
  • predicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"];

Индексы и полнотекстовый поиск

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

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

Выполнение поиска Используя объект запроса

Для выполнения запроса на основе объекта запроса выполнить одно из следующих действий:

  • Создайте a CKQueryOperation объект с помощью объекта запроса. Выполните работу непосредственно или добавьте его к очереди работы, чтобы выполнить запрос и поставить результаты.

  • Вызовите performQuery:inZoneWithID:completion: метод CKDatabase выполнить запрос. Обработайте результаты в своем обработчике завершения.

Запросы всегда работают асинхронно и поставляют результаты к обработчику завершения, который Вы обеспечиваете.

  • init (recordType:predicate:) - initWithRecordType:predicate: Определяемый инициализатор

    Инициализирует и возвращает объект запроса с указанными параметрами.

    Объявление

    Swift

    init!(recordType recordType: String!, predicate predicate: NSPredicate!)

    Objective C

    - (instancetype)initWithRecordType:(NSString *)recordType predicate:(NSPredicate *)predicate

    Параметры

    recordType

    Тип записи на поиск. Укажите имя одного из поддерживаемых типов записи Вашего приложения.

    Если этот параметр, этот метод выдает исключение nil или содержит пустую строку.

    predicate

    Поисковый предикат для применения к предполагаемым записям. Только записи, соответствующие критерии предиката, возвращаются в результатах поиска. Для инструкций по тому, как создать предикаты для Ваших запросов, посмотрите Построение Предиката для Запроса.

    Этот параметр не должен быть nil.

    Возвращаемое значение

    Инициализированный объект запроса.

    Обсуждение

    Вы не можете изменить тип записи и предикат объекта запроса после создания его. Если Вы хотите искать различный набор записей с помощью различного набора критериев поиска, создайте новый объект запроса. Можно добавить дескрипторы вида к запросу и изменить их позже по мере необходимости.

    Вы не можете запросить для пользовательских записей и выполнения запроса, где тип записи установлен в CKRecordTypeUserRecord результаты по ошибке. Необходимо выбрать пользовательские записи непосредственно с помощью их ID.

    Оператор импорта

    Objective C

    @import CloudKit;

    Swift

    import CloudKit

    Доступность

    Доступный в iOS 8.0 и позже.

  • recordType Свойство

    Тип записи для поиска. (только для чтения)

    Объявление

    Swift

    var recordType: String! { get }

    Objective C

    @property(nonatomic, readonly, copy) NSString *recordType

    Обсуждение

    Поиски возвращают только записи указанного типа. Это свойство установлено во время инициализации и не может быть изменено позже.

    Тип записи является специфичной для приложения строкой, которую Вы используете для различения среди записей приложения. Записи данного типа все представляют различные экземпляры той же информации. Например, тип записи сотрудника мог бы сохранить имя сотрудника, телефонный номер и ссылку на менеджера сотрудника.

    Оператор импорта

    Objective C

    @import CloudKit;

    Swift

    import CloudKit

    Доступность

    Доступный в iOS 8.0 и позже.

  • predicate Свойство

    Критерии поиска для использования при соответствии записей. (только для чтения)

    Объявление

    Swift

    @NSCopying var predicate: NSPredicate! { get }

    Objective C

    @property(nonatomic, readonly, copy) NSPredicate *predicate

    Обсуждение

    Предикат содержит одно или более выражений, оценивающих к истине или лжи. Выражения часто являются основанными на значении сравнениями, но предикаты поддерживают другие типы операторов, включая сравнения строк и совокупные операции. Для инструкций по тому, как создать предикаты для Ваших запросов, посмотрите Построение Предиката для Запроса.

    Это свойство установлено во время инициализации и не может быть изменено позже.

    Оператор импорта

    Objective C

    @import CloudKit;

    Swift

    import CloudKit

    Доступность

    Доступный в iOS 8.0 и позже.

  • sortDescriptors Свойство

    Дескрипторы вида для использования при организации результатов запроса.

    Объявление

    Swift

    var sortDescriptors: [AnyObject]!

    Objective C

    @property(nonatomic, copy) NSArray *sortDescriptors

    Обсуждение

    Это свойство содержит массив NSSortDescriptor объекты. Можно добавить, что дескрипторы вида к запросу возражают и изменяют их позже по мере необходимости. Каждый дескриптор вида содержит имя поля намеченного типа записи и информации о ли к значениям вида в том поле в порядке по возрастанию или порядке по убыванию. Значение по умолчанию этого свойства nil, что означает, что записи возвращаются в неопределенном порядке.

    Порядок элементов в массиве соответствует порядок, в котором дескрипторы вида применяются к результатам. Другими словами, первый дескриптор вида в массиве применяется сначала, сопровождается вторым дескриптором вида в случае необходимости и третьим, и т.д.

    Оператор импорта

    Objective C

    @import CloudKit;

    Swift

    import CloudKit

    Доступность

    Доступный в iOS 8.0 и позже.