Вилучення керованих об’єктів Core Data серед Cocoa, Mac OS, iOS, Apple, Xcode developer
У цьому розділі описується, як отримати керовані об'єкти та наводяться деякі міркування щодо забезпечення того, щоб вибірка була ефективною. Тут також показано, як можна використовувати об'єкти NSExpressionDescription для отримання конкретних значень.
Вилучення керованих об'єктів
Ви виконуєте вибірку керованих об'єктів шляхом надсилання запиту вибірки на керований об'єкт контексту. Для початку ви створюєте запит для вибірки. Як мінімум, ви повинні вказати об'єкт для запиту. Ви можете отримати сутність з керованої моделі об'єкта за допомогою методу entityForName:inManagedObjectContext: NSEntityDescription . Також можна встановити предикат, дескриптори сортування та інші атрибути при необхідності. Ви виймаєте об'єкти з контексту за допомогою executeFetchRequest:error: , як показано на прикладі нижче.
Листинг 1 Приклад створення та виконання запиту вибірки
Ви не можете витягувати з використанням предикатів на основі перехідних властивостей (хоча ви можете використовувати перехідні властивості для фільтрації у пам'яті самі). Крім того, є деякі взаємодії між вибіркою та типом сховища. Щоб підсумувати, якщо ви виконаєте вибірки безпосередньо, ви не повинні додавати Objective-C предикати або дескриптори сортування в запити вибірки. Натомість ви повинні застосувати це до результатів вибірки. Якщо ви використовуєте контролер масиву, вам може знадобитися створити підклас NSArrayController так що ви можете не проводити сортування в постійному сховищі, а натомість зробити сортування після того, як дані були вилучені.
Отримання окремих об'єктів
Якщо ваша програма використовує кілька контекстів, і ви хочете перевірити, чи є об'єкт видаленим із постійного сховища, виможете створити запит вибірки з предикатом у вигляді self ==%@ . Об'єкт, який ви передаєте як змінну може бути як керованим об'єктом або ID керованого об'єкта, як показано в наступному прикладі:
Довжина поверненого масиву з вибірки буде 0, якщо цільовий об'єкт був видалений. Якщо вам потрібно, перевірити на наявність декількох об'єктів, більш ефективно використовувати IN оператор, ніж виконувати кілька вибірок для окремих об'єктів, наприклад:
Набуття певних значень
Іноді ви не хочете отримувати фактичні керовані об'єкти, натомість ви просто хочете отримати, наприклад, найбільше чи найменше значення конкретного атрибуту. У Mac OS X 10.6 і вище і в iOS, ви можете використовувати NSExpressionDescription для безпосереднього отримання значень, які відповідають вашим критеріям.
Ви можете створити запит вибірки об'єкта і встановити його сутність, як і для нормальної вибірки, але:
-
Ви вказуєте, що вибірка має повертати словники.
Ви надсилаєте запиту вибірки повідомлення setResultType: з аргументом NSDictionaryResultType .
Ви створюєте NSExpressionDescription екземпляри, щоб вказати властивості, які ви хочете отримати.
Якщо ви просто хочете єдине значення, таке як найбільша зарплата в таблиці Employee, то ви просто створюєте єдиний опис виразу.
Існує ряд кроків, щоб відстежувати, створювати та використовувати висловлювання описів.
-
Перш за все, необхідно створити вирази (екземпляри NSExpression ) представляє ключ-шлях до значення, яке вас цікавить, і представити функцію, яку ви хочете застосувати (наприклад, max: або min: ):
Повний перелік підтримуваних функцій expressionForFunction:arguments:
| average: | NSArray об'єкт, що містить NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (середнє значення у масиві) | Mac OS X v10.4 і вище |
| sum: | NSArray об'єкт, що містить NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (сума значень у масиві) | Mac OS X v10.4 і вище |
| count: | NSArray об'єкт, що містить NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (кількість елементів у масиві) | Mac OS X v10.4 і вище |
| min: | NSArray об'єкт, що містить NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (мінімальне значення в масиві) | Mac OS X v10.4 і вище |
| max: | NSArray об'єкт, що містить NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (максимальне значення в масиві) | Mac OS X v10.4 і вище |
| median: | NSArray об'єкт, що містить NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (середнє значення у масиві) | Mac OS X v10.5 і вище |
| mode: | NSArray об'єкт, що містить NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (вид значень у масиві) | Mac OS X v10.5 і вище |
| stddev: | NSArray об'єкт, що містить NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (стандартна розбіжність значень у масиві) | Mac OS X v10.5 і вище |
| add:to: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (сума значень у масиві) | Mac OS X v10.5 і вище |
| from:subtract: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (результат віднімання другого значення масиві з першого значення масиві) | Mac OS X v10.5 і вище |
| multiply:by: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (результат множення значень у масиві) | Mac OS X v10.5 і вище |
| divide:by: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (результат поділу першого значення масиві на друге значення масиві) | Mac OS X v10.5 і вище |
| modulus:by: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (залишок від поділу першого значення масиві на друге значення масиві) | Mac OS X v10.5 і вище |
| sqrt: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє число | Об'єкт NSNumber (квадратний корінь із значення в масиві) | Mac OS X v10.5 і вище |
| log: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє число | Об'єкт NSNumber (логарифм із значення у масиві) | Mac OS X v10.5 і вище |
| ln: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє число | Об'єкт NSNumber (натуральний логарифм із значення у масиві) | Mac OS X v10.5 і вище |
| raise:toPower: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (результат зведення першого значення масиві в ступінь другого значення масиві) | Mac OS X v10.5 тавище |
| exp: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє число | Об'єкт NSNumber (базоване на експоненті значення масиві) | Mac OS X v10.5 і вище |
| ceiling: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє число | Об'єкт NSNumber (найменше ціле число не менше, ніж значення в масиві) | Mac OS X v10.5 і вище |
| abs: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє число | Об'єкт NSNumber (абсолютна величина значення масиві) | Mac OS X v10.5 і вище |
| trunc: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє число | Об'єкт NSNumber (значення інтеграла найближчого до, але не більше, ніж значення в масиві) | Mac OS X v10.5 і вище |
| random | nil | Об'єкт NSNumber (випадкове ціле значення) | Mac OS X v10.5 і вище |
| random: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє число | Об'єкт NSNumber (випадкове число в діапазоні від 0 до значення масиву (exclusive)) | Mac OS X v10.5 і вище |
| now | nil | Об'єкт NSDate (поточний час та дата) | Mac OS X v10.5 і вище |
| floor: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє число | Об'єкт NSNumber | iOS 3.0 та вище |
| uppercase: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє рядок | Об'єкт NSString | iOS 3.0 та вище |
| lowercase: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє рядок | Об'єкт NSString | iOS 3.0 та вище |
| bitwiseAnd:with: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (число сприймається як NSInteger ) | iOS 3.0 та вище |
| bitwiseOr:with: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (число сприймається як NSInteger ) | iOS 3.0 та вище |
| bitwiseXor:with: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (число сприймається як NSInteger ) | iOS 3.0 та вище |
| leftshift:by: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (число сприймається як NSInteger ) | iOS 3.0 та вище |
| rightshift:by: | NSArray об'єкт, що містить два NSExpression об'єкти, що представляють числа | Об'єкт NSNumber (число сприймається як NSInteger ) | iOS 3.0 та вище |
| onesComplement: | NSArray об'єкт, що містить один NSExpression об'єкт, що представляє число | Об'єкт NSNumber (число сприймається як NSInteger ) | iOS 3.0 та вище |
| noindex: | NSArray об'єкт, що містить NSExpression об'єкт | В результаті оцінки параметрів, начебто noindex: функціонального виразу немає. | iOS 3.0 та вище |
Ім'я це ключ, який буде використовуватися в словнику для значення, що повертається. Якщо ви хочете отримати кілька значень, таких як найбільша та найменша зарплати у таблиці Employee-ім'я кожноговираз опису має бути унікальним для даної вибірки запиту.
Потім можна виконати вибірку запиту як і будь-який інший (за допомогою executeFetchRequest:error: ). Запит повертається, хоча масив, що містить словник, ключів та значень відповідають іменам виразів описів та значень, які ви запросили.
У наступному прикладі показано, як можна отримати мінімальне значення атрибуту "creationDate" по суті під назвою "Event".
Вибірка та успадкування сутності
Якщо визначити ієрархію спадкування сутності, коли ви задаєте супер-сутність як сутність для запиту вибірки, запит повертає всі відповідні екземпляри супер-суші та суб-сутності. У деяких випадках можна вказати супер-сушіння як абстрактну. Щоб отримати відповідні екземпляри всіх конкретних суб-сутностей абстрактного об'єкта, необхідно задати об'єкт для вибірки специфікації, щоб бути абстрактною сутністю. У разі домену описаного в "Абстрактних сутностях", якщо Ви вкажете отримати запит із Graphic сутністю, вибірка повертає відповідні екземпляри Круг, Текстове поле та Лінія.