Создание и удаление управляемых объектов Core Data в среде Cocoa, Mac OS, iOS

Cocoa

Framework Core Data освобождает Вас от необходимости реализации многих механизмов, необходимых для управления данными (модели) объекта. Однако, это может наложить требование, чтобы объекты модели являлись экземплярами NSManagedObject или экземплярами классов, которые унаследованы от NSManagedObject, и что модель объекта должным образом интегрирована в инфраструктуру Core Data. Этот раздел описывает основные части инфраструктуры необходимой при создании управляемого объекта, и показывает как легко создать экземпляр управляемого объекта и интегрировать его в эту инфраструктуру. Затем здесь описываются процессы, которые абстрагируются для удобства методов, которые вы обычно используете для создания управляемого объекта, присвоения объекту конкретного хранилища, и, наконец, как удалять управляемый объект.

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

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

  • Должен быть экземпляром NSManagedObject или класса, который наследуется от NSManagedObject
  • Существует в среде, определяемой его контекстом управляемого объекта
  • Имеет соответствующее описание сущности, описывающий свойства объекта

В принципе, в силу этого необходимо проделать много работы, чтобы создать новый управляемый объект и правильно интегрировать в инфраструктуру Core Data. На практике, эта задача облегчается за счет удобного метода класса (insertNewObjectForEntityForName:inManagedObjectContext:) из NSEntityDescription. В следующем примере показан самый простой способ создания нового экземпляра сущности под названием "Employee".

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

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

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

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

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

Для того чтобы правильно интегрировать управляемый объект в инфраструктуру Core Data существует два элемента необходимых Вам:

  • управляемый объект контекста
  • описание сущности

Управляемый объект контекста

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

Контекст, по сути также является Вашим пропуском в остальную часть инфраструктуры Core Data. Таким образом, ожидается, что вы либо сохраните ссылку на контекст, или у вас есть средства легко извлекать ее, например, если вы разрабатываете документ-приложение, которое использует NSPersistentDocument, вы можете использовать managedObjectContext метод класса документа.

Описание сущности

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

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

SManagedObjectContext *context = <#Get a context#>;

NSManagedObjectModel *managedObjectModel = [[context persistentStoreCoordinator] managedObjectModel];

NSEntityDescription *employeeEntity = [[managedObjectModel entitiesByName] objectForKey:@"Employee"];

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

NSManagedObjectContext *context = /* предполагаем, что существует */;

NSEntityDescription *employeeEntity = [NSEntityDescription entityForName:@"Employee"
     inManagedObjectContext:context];

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

Принципиально NSManagedObject является Objective-C классом, как и любой другой Objective-C класс. Вы можете создать новый экземпляр, используя alloc.

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

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

Назначение объекта хранилищу

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

Вы указываете хранилище для объекта с помощью метода 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];

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

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

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

[aContext deleteObject:aManagedObject];

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

Отношения

Удаление управляемого объекта происходит по правилам, определенным в отношениях. При каскадных правилах удаления, удаляются все объекты в данном каскадном отношении, также при невозможности удаления, в связи с целостностью данных, определенных в отношении один ко многим или один к одному, удаление не будет произведено.

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

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

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac