CKQuery
Соответствует
-
AnyObject
-
CVarArgType
-
Сопоставимый
-
Hashable
-
NSCoding
-
NSCopying
-
NSObjectProtocol
-
NSSecureCoding
-
Печатаемый
-
NSCopying
-
NSObject
-
NSSecureCoding
Оператор импорта
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
объект.
Работа |
Поддерживаемые операторы |
---|---|
Основные сравнения |
|
Предикаты булева значения |
|
Основные составные предикаты |
|
Сравнения строк |
|
Совокупные операции |
|
Функции |
|
Указание неподдерживаемого оператора или типа данных в предикате Вашего запроса приводит к ошибке при выполнении запроса. Для получения дополнительной информации о создании объектов предиката, см. Руководство по программированию Предиката.
Демонстрационные строки формата предиката
Для соответствия записей, соединяющихся с различной записью, 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; // meters
NSPredicate predicate =
[NSPredicate predicateWithFormat:@"distanceToLocation:fromLocation:(location, %@) < %f", fixedLoc, radius]];
Для получения всех записей данного типа используйте TRUEPREDICATE
выражение как показано в Перечислении 7. Предикат с этим оператором всегда оценивает к истине и таким образом соответствует каждую запись. При использовании такого оператора рекомендуется использовать курсор для пакетной обработки результатов в меньшие группы для обработки.
NSPredicate predicate = nil;
predicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"];
Индексы и полнотекстовый поиск
Индексы позволяют искать содержание Ваших записей эффективно. Во время разработки сервер индексирует все поля, типы данных которых могут использоваться в предикате запроса. Это автоматическое индексирование упрощает экспериментировать с запросами во время разработки, но эти индексы занимают место в базе данных и занимают время, чтобы генерировать и поддержать. Таким образом, при миграции на продуктивную среду, удалите индексы для любых полей, которые Вы фактически не используете в запросах.
Полнотекстовый поиск является другой функцией, идущей по умолчанию для всех полей во время разработки. Когда Вы перемещаетесь в продуктивную среду, отключаете полнотекстовый поиск полей, содержание которых Вы не должны искать. Как с удалением индексов, отключая полнотекстовый поиск улучшает производительность Ваших маркируемых поисков.
Выполнение поиска Используя объект запроса
Для выполнения запроса на основе объекта запроса выполнить одно из следующих действий:
Создайте a
CKQueryOperation
объект с помощью объекта запроса. Выполните работу непосредственно или добавьте его к очереди работы, чтобы выполнить запрос и поставить результаты.Вызовите
performQuery:inZoneWithID:completion:
методCKDatabase
выполнить запрос. Обработайте результаты в своем обработчике завершения.
Запросы всегда работают асинхронно и поставляют результаты к обработчику завершения, который Вы обеспечиваете.
-
init (recordType:predicate:) - initWithRecordType:predicate:
Определяемый инициализаторИнициализирует и возвращает объект запроса с указанными параметрами.
Объявление
Swift
init!(recordType
recordType
: String!, predicatepredicate
: 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 и позже.