основные данные: различия между управляемым объектом и сущностями?

Я хотел бы понять немного больше Core Data, почему мы «извлекаем» и ищем сущности, в то время как сущности находятся «внутри» управляемых объектов? Например :

NSManagedObjectContext *moc = [self managedObjectContext];  
NSEntityDescription *entityDescription =
    [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc];  
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];  
[request setEntity:entityDescription];

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

Спасибо за ответы

Павел


person Paul    schedule 01.08.2011    source источник


Ответы (1)


В основном здесь 5 компонентов. Координатор постоянного хранилища, контекст управляемого объекта, модель управляемого объекта, сущности и управляемые объекты. Все они работают вместе, чтобы предоставить систему управления графом объектов (обратите внимание, что Core Data не ORM, поэтому это помогает не думать об этом таким образом). Ниже приводится описание компонентов и различных других классов в CoreData, которые с ними взаимодействуют.

  • NSPersistentStoreCoordinator - обрабатывает загрузку данных на диск и с диска. Он занимается различными магазинами (NSPersistentStore). Включенные типы хранилищ - двоичные, XML и SQLite. Вы можете написать свои собственные магазины (используя классы NSAtomicStore и NSIncrementalStore), например, если у вас есть собственный тип файла (теоретически вы можете написать магазин, чтобы открывать файл Word или Photoshop, если хотите)
  • NSEntityDescription - Сущность можно рассматривать как «класс» управляемого объекта. Он определяет любые атрибуты (NSAttributeDescription), отношения (NSRelationshipDescription) и выбранные свойства (NSFetchedPropertyDescription), которые должен иметь управляемый объект, а также другие свойства, такие как подкласс NSManagedObject, которые следует использовать
  • NSManagedObjectContext - Это блокнот в памяти. Здесь вы запрашиваете объекты (используя NSFetchRequests), создаете объекты, удаляете объекты и т. Д. У вас может быть несколько контекстов и отбрасывать один без сохранения, чтобы отменить любые изменения, которые вам больше не нужны.
  • NSManagedObject - основной блок Core Data. Это объекты вашей модели, в которых хранятся ваши данные. Вы устанавливаете для них атрибуты, отношения и т. Д.
  • NSManagedObjectModel - это модель данных, используемая для ваших данных, которая обычно определяется в файле .mom, созданном в Xcode. Здесь хранятся все сущности.

Это почти все основные данные. Есть еще несколько классов для миграции и слияния.

person Martin Pilkington    schedule 01.08.2011
comment
Нравится ответ, но с небольшими изменениями. Классы NSManagedObjectModel и NS*Description определяют, какие модели Core Data должны / могут содержать. NSPersistentStoreCoordinator - это класс, способный преобразовать то, что может быть в модели, в то, что находится в памяти, и наоборот. NSManagedObject экземпляры - это модели, реализованные в памяти. NSManagedObjectContext - это менеджер, который гарантирует, что то, что должно быть, в конечном итоге согласуется с тем, что есть. - person PeyloW; 02.08.2011
comment
Спасибо за оба ваших ответа, я все еще немного запутался с NSManagedObject и Entity: так что managedObject содержит 1 объект, а managedObjectModel содержит все управляемые объекты? или они разделены? - person Paul; 02.08.2011
comment
Модель управляемого объекта содержит все сущности. Контекст управляемого объекта содержит все управляемые объекты. У каждого управляемого объекта есть сущность (так же, как у каждого объекта есть класс). - person Martin Pilkington; 02.08.2011
comment
хорошо ... это объект как подкласс управляемого объекта? меня просто смущает то, что мы ищем не управляемые объекты, а сущности, если, как вы сказали, каждый управляющий объект содержит 1 сущность - person Paul; 02.08.2011
comment
Нет. Управляемый объект подобен экземпляру сущности. Если вы выполнили работу с базой данных до того, как представить ее в таком виде, сущность - это таблица, а управляемый объект - это строка. Вы указываете сущность для фильтрации управляемых объектов. В приведенном вами примере вы возвращаете все управляемые объекты сущности Employee. Опять же, если вы раньше работали с базами данных, то с точки зрения SQL вы могли бы сделать SELECT * FROM Employee - person Martin Pilkington; 04.08.2011
comment
Хорошо, спасибо большое! могу я задать тебе последний вопрос? постоянное хранилище объектов содержит одну строку из файла sqlite, и поэтому он заполнит один управляемый объект (= одну строку объекта)? или постоянное хранилище объектов содержит гораздо больше данных? - значит, если у вас есть 10 строк в вашем файле sqlite, представляющих 10 различных данных, у вас будет 10 постоянных хранилищ объектов, которые заполнят 10 управляемых объектов в сущности? Еще раз спасибо - person Paul; 04.08.2011
comment
Грубо говоря, постоянные хранилища сопоставляются с файлами на диске. Итак, если у вас есть файл sqlite, который является постоянным хранилищем, если у вас есть XML-файл, который является постоянным хранилищем и т. Д. Если вам нужен более подробный обзор, я рекомендую книгу основных данных прагматического программиста - person Martin Pilkington; 05.08.2011
comment
Большое спасибо, вы мне очень помогли! - person Paul; 06.08.2011
comment
Добавляем к ответу Мартина Пилкингтона на вопрос Пола: Пол, все наоборот; Управляемый объект - это подкласс описания сущности. - person Krishna Sapkota; 12.04.2014
comment
@KrishnaSapkota Это неверно. Управляемый объект создается с использованием описания сущности, но не является его подклассом (все управляемые объекты являются подклассами NSManagedObject, который, в свою очередь, является подклассом NSObject). - person Martin Pilkington; 17.04.2014