[Хабрахабр] Core Data для iOS. Глава №1. Теоретическая часть.pdf

(3806 KB) Pobierz
26
августа
2013
в
02:23
Core Data
для
iOS.
Глава №1. Теоретическая часть
Objective C*, Mobile Development*,
Разработка под
iOS*
Хабралюди, добрый де�½ь!
Сегод�½я хочу �½ачать �½аписа�½ие ряда лекций с практическими зада�½иями по к�½иги Михаеля Привата и Роберта Вар�½ера
«Pro Core Data for
iOS»,
которую можете купить по
этой
ссылке. Каждая глава будет содержать теоретическую и практическую часть.
Содержа�½ие:
Глава №1. Приступаем
(Практическая
часть)
Глава №2. Усваиваем
Core Data
Глава №3. Хра�½е�½ие да�½�½ых:
SQLite
и другие вариа�½ты
Глава №4. Созда�½ие модели да�½�½ых
Глава №5. Работаем с объектами да�½�½ых
Глава №6. Обработка результатирующих м�½ожеств
Глава №7. Настройка производитель�½ости и используемой памяти
Глава №8. Управле�½ие версиями и миграции
Глава №9. Управле�½ие таблицами с использова�½ием
NSFetchedResultsController
Глава №10. Использова�½ие
Core Data
в продви�½утых приложе�½иях
Приступаем
Что такое
Core Data?
Используя компьютеры для выпол�½е�½ия своих задач, люди рассчитывают, что в�½есе�½�½ые ими изме�½е�½ия будет сохра�½е�½ы. Сохра�½е�½ие
изме�½е�½ий играет важ�½ую роль в офис�½ых программ�½ых пакетах, текстовых редакторах, играх, браузерах и тд. Больши�½ство программ�½ого
обеспече�½ия �½уждается в возмож�½ости хра�½ить введе�½�½ые пользователем да�½�½ые для последующего восста�½овле�½ия состоя�½ия работы, �½о
ко�½еч�½о же есть и такое ПО, которое в этом �½е �½уждается
калькуляторы, �½овост�½ые ле�½ты, будиль�½ики, виджеты о погоде.
По�½има�½ие того, каким образом мож�½о хра�½ить да�½�½ые �½а
iDevice,
является критически важ�½ым при разработке продви�½утых приложе�½ий.
Apple
предоставляет гибкий фрэймворк для работы с хра�½имыми �½а устройстве да�½�½ыми
— Core Data.
Ко�½еч�½о же
Core Data
�½е па�½ацея и
есть другие вариа�½ты хра�½е�½ия да�½�½ых, которые могут лучше подойти при реше�½ии определе�½�½ых задач, �½о уж оче�½ь хорошо и красиво
Core Data
вписывается в
Cocoa Touch.
Больши�½ство деталей по работе с хра�½илищем да�½�½ых
Core Data
скрывает, позволяя вам
ско�½це�½трироваться �½а том, что действитель�½о делает ваше приложе�½ие веселым, у�½икаль�½ым и удоб�½ым в использова�½ии.
Не смотря �½а то, что
Core Data
может хра�½ить да�½�½ые в реляцио�½�½ой базе да�½�½ых вроде
SQLite, Core Data
�½е является СУБД. По-правде
Core
Data
в качестве хра�½илища может вообще �½е использовать реляцио�½�½ые базы да�½�½ых.
Core Data
�½е является чем-то вроде
Hibernate,
хотя и
предоставляет �½екоторые возмож�½ости
ORM. Core Data
скорее является оболочкой/фрэймворком для работы с да�½�½ыми, которая позволяет
работать с сущ�½остями и их связями
(от�½оше�½иями
к другим объектами), атрибутами, в том виде, который �½апоми�½ает работы с объект�½ым
графом в обыч�½ом объект�½о-орие�½тирова�½�½ом программирова�½ии.
З�½аете ли Вы?
Core Data
был в�½едрё�½ лишь �½ачи�½ая с
Mac OS X 10.4 Tiger
и
iPhone SDK 3.0
История хра�½е�½ия да�½�½ых в
iOS
Как за выпуще�½�½ые
Pixar
мультфильмы мы долж�½ы благодарить компа�½ию
NeXT,
так и за
Core Data
мы долж�½ы сказать ей спасибо.
Core Data
родилась и эволюцио�½ировала из тех�½ологии, �½азываемой
Enterprise Objects Framework (EOF).
Дебют фрэймворка приходится �½а
2005
год с запуском
Mac OS X 10.4 (Tiger),
а вот в
IPhone
появляется лишь �½ачи�½ая с версии
3.0.
До того, как
Core Data
пришла �½а
IPhone,
разработчикам приходилось �½е сладко и для хра�½е�½ия да�½�½ых могли быть использова�½ы
следующие вариа�½ты:
1)
Списки свойств, которые содержали пары ключ-з�½аче�½ие из различ�½ых типов да�½�½ых.
2)
Сериализация да�½�½ых и хра�½е�½ие их в файлах
(использовался
протокол
NSCoding)
3)
Реляцио�½�½ая база да�½�½ых
SQLite
4)
Хра�½е�½ие да�½�½ых в облаке
Эти методы всё еще продолжают использоваться, хотя и �½и оди�½ метод из четырёх �½е срав�½ится по удобству с использова�½ием
Core Data.
Несмотря �½а рожде�½ие таких фрэймворком, как
FMDatabase
и
ActiveRecord,
для реше�½ия проблемы с хра�½е�½ием да�½�½ых до появле�½ия
Core
Data,
разработчики с удовольствием переключились �½а
Core Data
после его появле�½ия.
Хотя повторюсь, что
Core Data
�½е является лекарством от всех болез�½ей, и�½огда вы ко�½еч�½о будете обращаться к реше�½иям с
использова�½ием, �½апример, списка свойств, �½о чаще всего вы будете сталкиваться с �½еобходимостью и жела�½ием использовать в своих
приложе�½иях име�½�½о
Core Data,
как и�½струме�½т, который �½аилучшим образом позволяет решить вашу проблему.
Чем чаще и чем больше вы будете программировать и использовать
Core Data,
тем чаще у вас будет воз�½икать �½е вопрос
«Стоит
ли м�½е
использовать
Core Data?»,
а
«Есть
ли причи�½а �½е использовать
Core Data?».
Созда�½ие простого приложе�½ия с
Core Data
В этой секции мы создадим простое приложе�½ие ос�½ова�½�½ое �½а
Core Data
из од�½ого из шабло�½ов
XCode,
ос�½ов�½ые части которого разберём.
В ко�½це этой части вы поймете, каким образом приложе�½ие взаимодействует с
Core Data
для хра�½е�½ия и получе�½ия да�½�½ых.
По�½има�½ие ос�½ов�½ых компо�½е�½тов
Core Data
Перед тем, как погрузиться в код и разбор тестового приложе�½ия, �½еобходимо иметь представле�½ие о компо�½е�½тах
Core Data.
На рису�½ке
�½иже продемо�½стрирова�½ы ос�½ов�½ые элеме�½ты, которые мы будем использовать в тестовом приложе�½ии.
Как пользователь
Core Data
вы �½икогда �½е долж�½ы работать �½апрямую с хра�½илищем да�½�½ых. Абстрагируйтесь от хра�½илища, от типа
хра�½илища, думайте только о да�½�½ых! Особе�½�½остью такого подхода является возмож�½ость безболез�½е�½�½о сме�½ить тип хра�½илища
(был XML
файл, а стал
SQLite)
�½е ме�½яя большое кол-ва �½аписа�½�½ого вами кода.
Объекты, которые �½аходятся под управле�½ием фрэймворка
(Core Data)
долж�½ы �½аследовать методы/свойства класса
NSManagedObject.
Так же, как и людям, объектам �½уж�½а среда в которой о�½и могут существовать, такая среда есть и, �½азывается о�½а
managed object context
(среда
управляемых объектов) или просто
context.
Среда, в которой �½аходится объект, следит �½е только за тем, в каком состоя�½ии
�½аходится объект с которым вы работаете, �½о и за состоя�½иями связа�½�½ых объектов
(объектов,
которые зависимы от да�½�½ого и от которых
зависим о�½ сам).
Экземпляр класса
NSManagedObjectContext
предоставляет ту самую среду для объектов, объект да�½�½ого типа долже�½ быть доступе�½ в вашем
приложе�½ии всегда. Обыч�½о экземпляр класса
NSManagedObjectContext
является свойством делегата вашего приложе�½ия. Без среды, без
экземпляра класса
NSManagedObjectContext
вам просто �½е удастся работать с
Core Data.
Созда�½ие �½ового проекта
Запустим
XCode
и создадим �½овый проект из шабло�½а
Master-Detail Application:
Запол�½им поля следующим образом:
И после заверше�½ия созда�½ия увидим пример�½о такую карти�½у:
Создать �½овую сущ�½ость мож�½о клик�½ув �½а к�½опку
"+"
в левой �½иж�½ей части
XCode,
а добавить �½овый атрибут сущ�½ости мож�½о �½ажав �½а
к�½опку
"+"
уже в разделе
«Attributes»
и затем выбрать его тип.
И�½ициализация ко�½текста
(среды)
Послед�½ий шаг состоит в и�½ициализации ко�½текста, хра�½илища и объект�½ой модели. Чаще всего вы можете воспользоваться кодом, который
автоматически ге�½ерируется
XCode
в
«пустых»
проектах использующих
Core Data.
DemoAppAppDelegate.h
#import
<UIKit/UIKit.h>
#import
<CoreData/CoreData.h>
@interface DemoAppDelegate : UIResponder <UIApplicationDelegate> {
}
@property (strong,
nonatomic)
UIWindow *window;
@property (strong,
nonatomic)
UINavigationController *navigationController;
@property (readonly,
strong, nonatomic)
NSManagedObjectModel *managedObjectModel;
@property (readonly,
strong, nonatomic)
NSManagedObjectContext *managedObjectContext;
@property (readonly,
strong, nonatomic)
NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationsDocumentsDirectory;
@end
Переключимся в
*.m
файл
DemoAppAppDelegate
и �½апишем следующие строки:
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
Далее следует код, который производит и�½ициализацию модели да�½�½ых, хра�½илища и ко�½текста.
- (NSManagedObjectModel *)managedObjectModel {
if
(_managedObjectModel !=
nil){
return
_managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modeURL];
return
_managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if(_persistentStoreCoordinator
!=
nil){
return
_persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"DemoApp.sqlite"];
NSError *error =
nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if(![_persistentStoreCoordinator
addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil
error&error]){
NSLog(@"Unresolved
error %@, %@",
error, [error userInfo]);
abort();
}
return
_persistentStoreCoordinator;
}
- (NSManagedObjectContext *)managedObjectContext {
if(_managedObjectContext
!=
nil){
return
_managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if(coordinator
!=
nil){
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return
_managedObjectContext;
}
Zgłoś jeśli naruszono regulamin