Создание и удаление управляемых объектов

Базовая Платформа Данных уменьшает, от потребности реализовать многие механизмы необходимо было управлять переносящими данные объектами (модели). Это действительно, тем не менее, налагает требование, чтобы объекты модели были экземплярами или экземплярами классов, наследовавшихся от, NSManagedObject, и что в объектах модели должным образом интегрируют к Базовой Информационной инфраструктуре. Этот документ сначала описывает основные части инфраструктуры, необходимо создать управляемый объект, и как легко инстанцировать экземпляра управляемого объекта и интегрировать его в ту инфраструктуру. Это тогда описывает процессы, абстрагированные удобными методами, которые Вы обычно используете для создания управляемого объекта; как присвоить объект определенному хранилищу; и наконец как удалить управляемый объект.

Создание, инициализируя и сохраняя управляемый объект

Управляемый объект является экземпляром класса Objective C. С этой точки зрения это не отличается от любого другого объекта, который Вы используете — можно просто создать использование экземпляра alloc. Управляемый объект отличается от других объектов тремя основными способами — управляемый объект:

В принципе существует поэтому большая работа, чтобы сделать, чтобы создать новый управляемый объект и должным образом интегрировать ее в Базовую Информационную инфраструктуру. На практике, однако, эта задача сделана простой методом класса удобства (insertNewObjectForEntityForName:inManagedObjectContext:) из NSEntityDescription. Следующий пример показывает самый простой способ создать новый экземпляр объекта под названием «Сотрудник».

NSManagedObject *newEmployee = [NSEntityDescription
    insertNewObjectForEntityForName:@"Employee"
    inManagedObjectContext:context];

Метод возвращается, экземпляр любого класса определяется в модели управляемого объекта для представления объекта, инициализированного со значениями по умолчанию, данными для его объекта в модели.

Во многих случаях значения по умолчанию, которые Вы устанавливаете в модели, могут быть достаточными. Иногда, однако, можно хотеть выполнить дополнительную инициализацию — возможно, использование динамических значений (таких как текущая дата и время), который не может быть представлен в модели. В типичном приложении Какао Вы переопределили бы класс init метод для обеспечения этой функциональности. С NSManagedObject, Вы отговорены переопределить initWithEntity:insertIntoManagedObjectContext:; вместо этого, Базовые Данные обеспечивают несколько других средних значений инициализации значений — они описаны в Объектный Жизненный цикл — Инициализация и Освобождение.

Просто создание управляемого объекта не заставляет его быть сохраненным к персистентному хранилищу. Контекст управляемого объекта действует как временная память. Можно создать и зарегистрировать объекты в нем, внести изменения в объекты, и отменить и восстановить изменения, как Вы желаете. При внесении изменений в управляемые объекты связанными с данным контекстом те изменения остаются локальными для того контекста, пока Вы не фиксируете изменений путем отправки контекста a save: сообщение. В той точке — при условии, что нет никаких ошибок проверки — изменения посвящают себя хранилищу.

См. также Присвоение Объекта к Хранилищу.

Негласно создания управляемого объекта

Несмотря на то, что NSEntityDescriptionудобный метод упрощает создавать и конфигурировать новый управляемый объект, это может быть поучительно для детализации то, что происходит негласно. Если это не имеет текущей процентной ставки, можно безопасно пропустить этот раздел (перейдите к Присвоению Объекта к Хранилищу) — Вы призваны, однако, пересмотреть этот материал, чтобы гарантировать, чтобы Вы полностью поняли процесс.

Для надлежащей интеграции управляемого объекта в Базовую Информационную инфраструктуру существует два элемента, в которых Вы нуждаетесь:

Контекст управляемого объекта

Контекст ответственен за посредничество между его управляемыми объектами и остальной частью Базовой Информационной инфраструктуры. Инфраструктура поочередно ответственна за, например, переводя изменения в управляемых объектах в действия отмены, сохраняемые контекстом, и также в операции, которые должны быть выполнены на персистентном хранилище, с которым присваивается управляемый объект.

Контекст имеет силу также Ваш шлюз к остальной части Базовой Информационной инфраструктуры. Также, ожидается, что Вы или сохраняете ссылку на контекст, или у Вас есть средние значения простого получения его — например, при разработке использующего основанного на документе приложения NSPersistentDocument, можно использовать класс документа managedObjectContext метод.

Описание объекта

Описание объекта указывает (среди других вещей) имя объекта, класс раньше представлял объект и свойства объекта. Описание объекта важно, так как данный класс может использоваться для представления больше чем одного объекта — по умолчанию, все объекты представлены NSManagedObject. Базовые Данные используют описание объекта для определения, какие свойства управляемый объект имеет, что потребности быть сохраненным к или полученным от персистентного хранилища, и что ограничения, там находятся на значениях свойств. Описания объекта являются свойствами модели управляемого объекта.

Учитывая контекст управляемого объекта, Вы могли получить надлежащее описание объекта через персистентного координатора хранилища, как проиллюстрировано в следующем примере:

NSManagedObjectContext *context = <#Get a context#>;
NSManagedObjectModel *managedObjectModel =
    [[context persistentStoreCoordinator] managedObjectModel];
NSEntityDescription *employeeEntity =
    [[managedObjectModel entitiesByName] objectForKey:@"Employee"];

На практике Вы использовали бы удобный метод entityForName:inManagedObjectContext: из NSEntityDescription который делает ту же вещь — как проиллюстрировано в следующем примере:

NSManagedObjectContext *context = /* assume this exists */;
NSEntityDescription *employeeEntity = [NSEntityDescription
            entityForName:@"Employee"
            inManagedObjectContext:context];

Создание управляемого объекта

Существенно NSManagedObject класс Objective C как любой другой класс Objective C. Как различные другие классы, NSManagedObject налагает некоторые ограничения на создание экземпляра. Как описано ранее, необходимо связать новый экземпляр управляемого объекта с объектом объекта, определяющим его свойства и с помощью контекста управляемого объекта, определяющего его среду. Вы не можете поэтому инициализировать управляемый объект просто путем отправки init сообщение, необходимо использовать определяемый инициализатор —initWithEntity:insertIntoManagedObjectContext:— который устанавливает и объект и контекст:

NSManagedObject *newEmployee = [[NSManagedObject alloc]
            initWithEntity:employeeEntity
            insertIntoManagedObjectContext:context];

Это имеет силу что NSEntityDescriptionудобный метод insertNewObjectForEntityForName:inManagedObjectContext: делает для Вас — включая поиск экземпляра объекта, описанный в Описании Объекта. Это - то, почему необходимо обычно использовать тот метод, а не NSManagedObject initWithEntity:insertIntoManagedObjectContext:.

Важная дополнительная точка здесь - это initWithEntity:insertIntoManagedObjectContext: возвращает экземпляр класса, указанного описанием объекта для представления объекта. Если Вы хотите создать новый объект Сотрудника, и в модели Вы указали, что объект Сотрудника должен быть представлен пользовательским классом, сказать Employee, это возвращает экземпляр Employee. Если Вы указали, что объект Сотрудника должен быть представлен NSManagedObject, это возвращает экземпляр NSManagedObject.

Присвоение объекта к хранилищу

Обычно существует только одно персистентное хранилище для данного объекта, и Базовые Данные автоматически гарантируют, что новые объекты сохраняются к этому хранилищу, когда сохраняется контекст управляемого объекта объекта. Иногда, однако, у Вас могут быть многократные перезаписываемые хранилища для данного объекта —, например, можно хранить некоторые данные в определенном документе, и некоторые в общем глобальном репозитории (скажите, хранилище в папке Application Support пользователя). В этой ситуации необходимо указать хранилище, в котором состоит в том, чтобы находиться объект.

Вы указываете хранилище для объекта с помощью NSManagedObjectContext метод, assignObject:toPersistentStore:. Этот метод берет в качестве его второго параметра идентификатор для хранилища. Вы получаете идентификатор хранилища от персистентного координатора хранилища, с помощью, например, persistentStoreForURL:. Следующий пример иллюстрирует полный процесс создания нового управляемого объекта и присвоения его к глобальному хранилищу.

NSURL *storeURL = <#URL for path to global store#>;
 
id globalStore = [[context persistentStoreCoordinator]
    persistentStoreForURL:storeURL];
 
NSManagedObject *newEmployee = [NSEntityDescription
    insertNewObjectForEntityForName:@"Employee"
    inManagedObjectContext:context];
 
[context assignObject:newEmployee toPersistentStore:globalStore];

Конечно, объект не сохраняется к хранилищу, пока не сохраняется контекст управляемого объекта.

Удаление управляемого объекта

Удаление управляемого объекта является прямым. Вы просто отправляете его контекст управляемого объекта a deleteObject: сообщение, передавая объект Вы хотите удалить как параметр.

[aContext deleteObject:aManagedObject];

Это удаляет управляемый объект из графа объектов. Так же, как новый объект не сохраняется к хранилищу, пока контекст не сохраняется, удаленный объект не удален из хранилища, пока не сохраняется контекст.

Отношения

При удалении управляемого объекта, важно считать свои отношения и в частности удалить правила указанными для отношений. Если все отношение управляемого объекта удаляет правила, Аннулируют, то для того объекта, по крайней мере, нет никакой дополнительной работы, чтобы сделать (Вам, вероятно, придется рассмотреть другие объекты, которые были в месте назначения отношения — если бы обратная связь была или обязательна или имела нижний предел на кардинальности, то целевой объект или объекты могли бы быть в недопустимом состоянии). Если отношение удаляет правило, Каскад, то удаление одного объекта может привести к удалению других. Если правило, Отклоняют, то перед удалением объекта, необходимо удалить целевой объект или объекты от отношения, иначе Вы получите ошибку проверки, когда Вы сохраните. Если удалить правило не является Никаким Действием, то необходимо гарантировать, чтобы Вы предприняли любые шаги, необходимы для обеспечения целостности графа объектов. Для получения дополнительной информации посмотрите, что Отношение Удаляет Правила.

Удаленное состояние и уведомления

Можно узнать, был ли управляемый объект отмечен для удаления путем отправки его isDeleted сообщение. Если возвращаемое значение YES, это означает, что объект будет удален во время следующей работы сохранения или помещен иначе, что объект отмечен удаленный для текущей (незаконченной) транзакции. Кроме того, когда Вы отправляете контекст управляемого объекта a deleteObject: сообщение, контекст отправляет a NSManagedObjectContextObjectsDidChangeNotification уведомление это включает недавно-удаленный-объект в его список удаленных объектов. Отметьте, однако, что объект, отмечаемый для удаления от контекста, не является тем же как тем, что это было отмеченным для удаления от персистентного хранилища. Если объект будет создан и удален в той же транзакции — т.е. без прошедшей работы сохранения, то — это не появится в массиве, возвращенном NSManagedObjectContext deletedObjects метод или в наборе удаленных объектов в a NSManagedObjectContextDidSaveNotification уведомление.