CKQuery
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 объект.
Работа |
Поддерживаемые операторы |
|---|---|
Основные сравнения |
|
Предикаты булева значения |
|
Основные составные предикаты |
|
Сравнения строк |
|
Совокупные операции |
|
Функции |
|
Указание неподдерживаемого оператора или типа данных в предикате Вашего запроса приводит к ошибке при выполнении запроса. Для получения дополнительной информации о создании объектов предиката, см. Руководство по программированию Предиката.
Демонстрационные строки формата предиката
Для соответствия записей, соединяющихся с различной записью, ID которой Вы знаете создайте предикат, соответствующий поле, содержащее ссылочный объект как показано в Перечислении 1. В примере, employee поле записи содержит a CKReference возразите что точки против другой записи. Когда запрос выполняется, соответствие происходит когда ID в локально создаваемый CKReference объектом является тот же ID, найденный в указанном поле записи.
CKReference* recordToMatch = [[CKReference alloc] initWithRecordID:employeeID action:CKReferenceActionNone];NSPredicate* predicate = [NSPredicate predicateWithFormat:@"employee == %@", recordToMatch];
Для соответствия содержания поля к определенному значению используйте предикат, подобный тем показанным в Перечислении 2. Все перечисленные предикаты генерируют тот же набор результатов, в примере означающий что favoriteColors поле содержит значение red. Значение в поле должно соответствовать значение, которое Вы указываете в предикате точно. Основанные на операция со строками сравнения нечувствительны к регистру, но иначе все сравнения должны быть точным совпадением указанного значения.
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.
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.
NSString* matchString = @"red";NSPredicate predicate = nil;predicate = [NSPredicate predicateWithFormat:@"ANY favoriteColors BEGINSWITH 'red'"]predicate = [NSPredicate predicateWithFormat:@"ANY favoriteColors BEGINSWITH %@", matchString]
Для выполнения маркируемого поиска полей записи используйте специальный оператор self. Маркируемый поиск ищет любые поля, которым включили полнотекстовый поиск, который является всеми основанными на операция со строками полями по умолчанию. Перечисление 5 показывает пример, ищущий поля записи для строк маркера bob и smith. Каждое отличное слово обрабатывается как отдельный маркер в целях поиска. Сравнения являются случаем - и нечувствительный к диакритическому знаку. Эти строки маркера могут быть найдены в единственном поле или в многократных полях, но все маркеры должны присутствовать в записи для него, чтобы считаться соответствием.
NSPredicate predicate = nil;predicate = [NSPredicate predicateWithFormat:@"self contains 'bob smith'"]
Чтобы протестировать, являются ли два расположения друг около друга, создайте предикат с помощью distanceToLocation:fromLocation: функционируйте как показано в Перечислении 6. Предикатам, использующим эту функцию, нужно было показать структуру в перечислении. В Вашем коде замените location переменная с именем поля от одной из Ваших записей. (Этот тип данных для поля должен быть a CLLocation объект.) Точно так же заменяют fixedLoc и radius значения с надлежащими значениями из Вашего приложения. fixedLoc значение является географической координатой, отмечающей центр круга с указанным радиусом. Если расположение в записи в 10 километрах указанной широты и долготы, в этом примере предикат возвращает соответствие.
CLLocation* fixedLoc = [[CLLocation alloc] initWithLatitude:37.331913 longitude:-122.030210];CGFloat radius = 10000; // metersNSPredicate predicate =[NSPredicate predicateWithFormat:@"distanceToLocation:fromLocation:(location, %@) < %f", fixedLoc, radius]];
Для получения всех записей данного типа используйте TRUEPREDICATE выражение как показано в Перечислении 7. Предикат с этим оператором всегда оценивает к истине и таким образом соответствует каждую запись. При использовании такого оператора рекомендуется использовать курсор для пакетной обработки результатов в меньшие группы для обработки.
NSPredicate predicate = nil;predicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"];
Индексы и полнотекстовый поиск
Индексы позволяют искать содержание Ваших записей эффективно. Во время разработки сервер индексирует все поля, типы данных которых могут использоваться в предикате запроса. Это автоматическое индексирование упрощает экспериментировать с запросами во время разработки, но эти индексы занимают место в базе данных и занимают время, чтобы генерировать и поддержать. Таким образом, при миграции на продуктивную среду, удалите индексы для любых полей, которые Вы фактически не используете в запросах.
Полнотекстовый поиск является другой функцией, идущей по умолчанию для всех полей во время разработки. Когда Вы перемещаетесь в продуктивную среду, отключаете полнотекстовый поиск полей, содержание которых Вы не должны искать. Как с удалением индексов, отключая полнотекстовый поиск улучшает производительность Ваших маркируемых поисков.
Выполнение поиска Используя объект запроса
Для выполнения запроса на основе объекта запроса выполнить одно из следующих действий:
Создайте a
CKQueryOperationобъект с помощью объекта запроса. Выполните работу непосредственно или добавьте его к очереди работы, чтобы выполнить запрос и поставить результаты.Вызовите
performQuery:inZoneWithID:completion:методCKDatabaseвыполнить запрос. Обработайте результаты в своем обработчике завершения.
Запросы всегда работают асинхронно и поставляют результаты к обработчику завершения, который Вы обеспечиваете.
Соответствует
-
AnyObject -
CVarArgType -
Сопоставимый -
Hashable -
NSCoding -
NSCopying -
NSObjectProtocol -
NSSecureCoding -
Печатаемый -
NSCopying -
NSObject -
NSSecureCoding
Оператор импорта
Swift
import CloudKit
Objective C
@import CloudKit;
Доступность
Доступный в OS X v10.10 и позже.
-
init (recordType:predicate:) - initWithRecordType:predicate:Определяемый инициализаторИнициализирует и возвращает объект запроса с указанными параметрами.
Объявление
Swift
init!(recordTyperecordType: String!, predicatepredicate: NSPredicate!)Objective C
- (instancetype)initWithRecordType:(NSString *)recordTypepredicate:(NSPredicate *)predicateПараметры
recordTypeТип записи на поиск. Укажите имя одного из поддерживаемых типов записи Вашего приложения.
Если этот параметр, этот метод выдает исключение
nilили содержит пустую строку.predicateПоисковый предикат для применения к предполагаемым записям. Только записи, соответствующие критерии предиката, возвращаются в результатах поиска. Для инструкций по тому, как создать предикаты для Ваших запросов, посмотрите Построение Предиката для Запроса.
Этот параметр не должен быть
nil.Возвращаемое значение
Инициализированный объект запроса.
Обсуждение
Вы не можете изменить тип записи и предикат объекта запроса после создания его. Если Вы хотите искать различный набор записей с помощью различного набора критериев поиска, создайте новый объект запроса. Можно добавить дескрипторы вида к запросу и изменить их позже по мере необходимости.
Вы не можете запросить для пользовательских записей и выполнения запроса, где тип записи установлен в
CKRecordTypeUserRecordрезультаты по ошибке. Необходимо выбрать пользовательские записи непосредственно с помощью их ID.Оператор импорта
Objective C
@import CloudKit;Swift
import CloudKitДоступность
Доступный в OS X v10.10 и позже.
-
recordType recordTypeСвойствоТип записи для поиска. (только для чтения)
Объявление
Swift
var recordType: String! { get }Objective C
@property(nonatomic, readonly, copy) NSString *recordTypeОбсуждение
Поиски возвращают только записи указанного типа. Это свойство установлено во время инициализации и не может быть изменено позже.
Тип записи является специфичной для приложения строкой, которую Вы используете для различения среди записей приложения. Записи данного типа все представляют различные экземпляры той же информации. Например, тип записи сотрудника мог бы сохранить имя сотрудника, телефонный номер и ссылку на менеджера сотрудника.
Оператор импорта
Objective C
@import CloudKit;Swift
import CloudKitДоступность
Доступный в OS X v10.10 и позже.
-
Критерии поиска для использования при соответствии записей. (только для чтения)
Объявление
Swift
@NSCopying var predicate: NSPredicate! { get }Objective C
@property(nonatomic, readonly, copy) NSPredicate *predicateОбсуждение
Предикат содержит одно или более выражений, оценивающих к истине или лжи. Выражения часто являются основанными на значении сравнениями, но предикаты поддерживают другие типы операторов, включая сравнения строк и совокупные операции. Для инструкций по тому, как создать предикаты для Ваших запросов, посмотрите Построение Предиката для Запроса.
Это свойство установлено во время инициализации и не может быть изменено позже.
Оператор импорта
Objective C
@import CloudKit;Swift
import CloudKitДоступность
Доступный в OS X v10.10 и позже.
-
sortDescriptors sortDescriptorsСвойствоДескрипторы вида для использования при организации результатов запроса.
Объявление
Swift
var sortDescriptors: [AnyObject]!Objective C
@property(nonatomic, copy) NSArray *sortDescriptorsОбсуждение
Это свойство содержит массив
NSSortDescriptorобъекты. Можно добавить, что дескрипторы вида к запросу возражают и изменяют их позже по мере необходимости. Каждый дескриптор вида содержит имя поля намеченного типа записи и информации о ли к значениям вида в том поле в порядке по возрастанию или порядке по убыванию. Значение по умолчанию этого свойстваnil, что означает, что записи возвращаются в неопределенном порядке.Порядок элементов в массиве соответствует порядок, в котором дескрипторы вида применяются к результатам. Другими словами, первый дескриптор вида в массиве применяется сначала, сопровождается вторым дескриптором вида в случае необходимости и третьим, и т.д.
Оператор импорта
Objective C
@import CloudKit;Swift
import CloudKitДоступность
Доступный в OS X v10.10 и позже.
