Вандад Нахавандипур - iOS. Приемы программирования
В нижней части окна редактора найдите кнопку +. Щелкните правой кнопкой мыши, удерживая указатель на этом плюсике, а потом выберите из контекстного меню вариант Add Entity (Добавить сущность) (рис. 16.3).
Рис. 16.3. Добавление новой сущности к модели данных
Сущность, которую вы создали, сразу же после создания будет находиться в состоянии, позволяющем немедленно ее переименовать. Измените название этой сущности на Person (Контакт) (рис. 16.4).
Рис. 16.4. Изменение имени новой сущности на Person
Выберите сущность Person, потом щелкните на + в области Attributes (Атрибуты) и создайте для сущности три следующих атрибута (рис. 16.5):
• firstName (типа String);
• lastName (типа String);
• age (типа Integer 32).
Рис. 16.5. Мы добавили три атрибута к сущности Person
В редакторе модели данных выберите из меню View (Вид) в Xcode команду Utilities — Show Utilities (Вспомогательная область — Отобразить вспомогательные возможности). В правой части Xcode откроется вспомогательная область. В верхней части этой области нажмите кнопку Data Model Inspector (Инспектор модели данных) и убедитесь, что не забыли щелкнуть на только что созданной нами сущности Person (Контакт). На данном этапе инспектор модели данных заполнится элементами, относящимися к сущности Person (рис. 16.6).
Рис. 16.6. Инспектор модели данных отображается в правой части окна Xcode
Теперь щелкните на атрибутах firstName, lastName и age сущности Person. Убедитесь, что атрибуты firstName и lastName не являются опциональными — флажок Optional должен быть снят. При этом для атрибута age флажок Optional должен быть установлен.
Итак, мы создали модель. Выполните команду File — Save (Файл — Сохранить), чтобы убедиться, что сделанные изменения сохранены. О том, как сгенерировать код на базе только что созданной вами модели, рассказывается в разделе 16.2.
16.2. Генерирование файлов классов для сущностей Core Data
Постановка задачи
Вы выполнили все инструкции из раздела 16.1. Теперь требуется научиться создавать код на основании имеющейся объектной модели.
Решение
Выполните следующие шаги.
1. В Xcode найдите созданный для вашего приложения файл с расширением xcdatamodel. Он был заготовлен на этапе создания самого приложения в Xcode. Щелкните на этом файле — и вы должны увидеть, как в правой части окна Xcode открывается редактор.
2. Выберите сущность Person, созданную нами ранее (см. раздел 16.1).
3. Выполните в Xcode команду File — New File (Файл — Новый файл).
4. В диалоговом окне New File (Новый файл) убедитесь, что выбрали iOS в качестве основной категории, а Core Data — в качестве подкатегории. Потом укажите в правой части окна элемент NSManagedObject subclass (Подкласс NSManagedObject) и нажмите Next (Далее) (рис. 16.7).
Рис. 16.7. Создание в Xcode подкласса управляемого объекта
5. На следующем экране выберите модель управляемого объекта, которую вы хотите сохранить на диске, и отметьте ее флажком. Сделав это, нажмите кнопку Next (Далее) (рис. 16.8).
Рис. 16.8. Выбор модели управляемого объекта для сохранения на диске
Если в вашем проекте всего одна модель, то и в списке вы увидите всего одну модель управляемого объекта. Но на рис. 16.8 мы видим много моделей. Дело в том, что в моем рабочем пространстве в Xcode присутствует множество проектов и каждый из них имеет свою модель.
6. Теперь система предложит вам выбрать сущности, которые вы хотите экспортировать из своей модели на диск в виде файлов Objective-C. Поскольку мы создали всего одну сущность — Person, ваш список будет выглядеть примерно как на рис. 16.9. Убедитесь, что сущность Person отмечена, а потом нажмите кнопку Next (Далее).
Рис. 16.9. Экспорт сущности Person на диск в качестве управляемого объекта
7. На последнем этапе вам будет предложено сохранить сущность на диске. Убедитесь, что ваш проект отмечен в поле Targets (Цели) (рис. 16.10). В противном случае эта сущность не будет доступна в других файлах исходного кода, используемых в проекте. Если вас все устраивает, нажмите кнопку Create (Создать).
Рис. 16.10. Сохранение сущности на диске
Итак, вы увидите в своем проекте два файла, которые называются Person.h и Person.m. Откройте файл Person.h. Там будет написано следующее:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface Person: NSManagedObject
@property (nonatomic, retain) NSNumber * age;
@property (nonatomic, retain) NSString * firstName;
@property (nonatomic, retain) NSString * lastName;
@end
Файл Person.m реализуется следующим образом:
#import «Person.h»
@implementation Person
@dynamic age;
@dynamic firstName;
@dynamic lastName;
@end
Вот и все! Мы выполнили реальное определение и реализацию управляемого объекта. В разделе 16.3 мы научимся инстанцировать и сохранять управляемый объект типа Person в контексте управляемых объектов приложения.
Обсуждение
Когда мы создавали в Xcode модель данных с помощью редактора, в ходе этой работы создавали отношения данных, сущности, атрибуты и т. д. Тем не менее, чтобы эту модель можно было использовать в приложении, для нее нужно сгенерировать код. Если просмотреть файлы. h и. m ваших сущностей, то выяснится, что все атрибуты присваиваются динамически. В.m-файле сущностей вы увидите директиву @dynamic. Она сообщает компилятору, что вы выполните запрос каждого атрибута во время исполнения с применением динамического расширения метода.
Код, применяемый во фреймворке Core Data к вашим сущностям, остается совершенно невидимым. На самом деле действительно нет никакой необходимости в том, чтобы программист видел этот код. Все, о чем следует знать, — сущность Person имеет три атрибута: firstName, lastName и age. Этим атрибутам можно присваивать значения (если они являются свойствами, доступными для чтения и записи), их можно сохранять в контекст и загружать из контекста, как будет показано в разделе 16.3.
16.3. Создание и сохранение данных с помощью Core Data
Постановка задачи
Вы создали управляемый объект. После этого вы хотите инстанцировать его и вставить этот экземпляр в контекст Core Data вашего приложения.
Решение
Выполните инструкции, описанные в разделах 16.1 и 16.2. Теперь можно использовать метод класса insertNewObjectForEntityForName: inManagedObjectContext:, относящийся к классу NSEntityDescription, чтобы создать новый объект типа, указанного в первом параметре этого метода. Как только будет создана новая сущность (управляемый объект), ее можно будет изменить, модифицируя ее свойства. После того как все будет готово, сохраните контекст управляемого объекта с помощью метода экземпляра save:, относящегося к контексту управляемых объектов.
Предполагается, что вы уже создали в Xcode универсальное приложение под названием Creating and Saving Data Using Core Data. Теперь, чтобы вставить новый управляемый объект в контекст, выполните следующие шаги.
1. Найдите файл под названием Creating_and_Saving_Data_Using_Core_DataAppDelegate.m.
2. Импортируйте файл Person.h в файл реализации делегата приложения:
Сущность Person мы создали в разделе 16.1.
#import «AppDelegate.h»
#import «Person.h»
@implementation AppDelegate
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
<# Остаток кода вашего приложения находится здесь #>
В методе application: didFinishLaunchingWithOptions: совместно используемого делегата приложения напишем следующий код:
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
Person *newPerson = [NSEntityDescription
insertNewObjectForEntityForName:@"Person"
inManagedObjectContext: self.managedObjectContext];
if (newPerson!= nil){
newPerson.firstName = @"Anthony";
newPerson.lastName = @"Robbins";
newPerson.age = @51;
NSError *savingError = nil;
if ([self.managedObjectContext save:&savingError]){
NSLog(@"Successfully saved the context.");
} else {
NSLog(@"Failed to save the context. Error = %@", savingError);
}
} else {
NSLog(@"Failed to create the new person.");
}
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];