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

Cocoa

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

Сборка модели данных

Данные модели являются развертываемым ресурсомв. В дополнение к подробной информации о сущности и свойствах в модели, модели, созданные в Xcode содержат информацию о схеме, ее расположение, цвет элементов, и так далее. Эта последняя информация не нужна во время выполнения. Файл модели компилируется с использованием компилятора модели, momc, для удаления посторонней информации и сборки загружаемых ресурсов как можно более эффективными. xcdatamodeld - каталог "источника" скомпилированный в momd каталог развертывания и xcdatamodel файл "источника" компилируется в файл развертывания mom.

Загрузка модели данных

В некоторых случаях вам не нужно писать код для загрузки модели. Если вы используете документа-приложения на Mac OS X, NSPersistentDocument управляет задачей поиска и загрузки модели приложения за вас. Если вы используете Xcode для создания не-документ приложения, которое использует основные данные (для Mac OS X или iOS), делегат приложениz включает код для извлечения модели. Название модели - наименование файла используемого для хранения его на диске не имеет значения во время выполнения. После того как модель загружает основные данные, имя файла не имеет никакого смысла, так что вы можете назвать файл модели, как угодно.

Если вы хотите загрузить модель сами, есть два механизма, которые вы можете использовать:

  • Вы можете загрузить одну модель из определенного URL, используя метод экземпляра initWithContentsOfURL:.

    Это как правило, предпочтительный метод. Обычно приложение имеет одну модель, и с помощью этого метода вы убедитесь, что вы выполняете загрузку только этой модели. Вы можете также загрузить отдельные модели с помощью URL-адреса, а затем объединить их с помощью modelByMergingModels: до создания экземпляра координатора с ними.

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

  • Вы можете создать объединенную модель из определенной коллекции пакетов (bundles), используя метод класса mergedModelFromBundles:.

    Этот метод может оказаться полезным в тех случаях, когда разделение моделей не важно, например, вы знаете, что приложение и framework ссылаются на обе модели вам необходимые. Метод класса позволяет легко загружать все модели сразу, без необходимости рассмотрения, их имен, или положить в специальный код инициализации для обеспечения всех своих найденных моделей.

Доступ и использование управляемой объектной модели во время выполнения

Иногда нужно получить доступ к модели во время работы, например, чтобы получить выборку запроса по шаблону, локализованное имя сущности, или, возможно, тип данных атрибута. Вы также можете программно изменять модели (вы можете сделать это только до ее использования во время выполнения). Есть несколько способов, которыми Вы можете получить доступ к управляемой объектной модели во время выполнения. Благодаря постоянному стеку вы в конечном итоге получаете модель постоянного координатора хранилища. Таким образом, чтобы получить модель управляемого объекта контекста, можно использовать следующий код:

[[<#Управляемый контекст объекта#> persistentStoreCoordinator] managedObjectModel];

Вы также можете получить модель с описанием сущности, поэтому данный управляемый объект, вы можете получить с описанием сущности и, следовательно, модель, как показано в следующем примере.

[[<#Управляемый объект#> entity] managedObjectModel];

В некоторых случаях вы сохраняете «прямые» ссылки на модели, то есть метод, который возвращает модель непосредственно. NSPersistentDocument обеспечивает managedObjectModel, который возвращает модель, связанную с постоянным координатором хранилища используемым управляемым объектом контекста документа. Если вы используете Core Data Application шаблон, делегат приложения содержит ссылку на модель.

Создание шаблонов запроса выборки программно

Можно создать шаблоны запроса выборки программно и связать их с используемой моделью методом setFetchRequestTemplate:forName: как показано в листинге 1. Однако, можно изменить только модели, прежде чем они были использован в координаторе хранилищ.

Листинг 1 Создание шаблонов запроса выборки программно

NSManagedObjectModel *model = <#Получить модель#>;

NSFetchRequest *requestTemplate = [[NSFetchRequest alloc] init];

NSEntityDescription *publicationEntity = [[model entitiesByName] objectForKey:@"Publication"];

[requestTemplate setEntity:publicationEntity];

NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:
    @"(mainAuthor.firstName like[cd] $FIRST_NAME) AND \
        (mainAuthor.lastName like[cd] $LAST_NAME) AND \
        (publicationDate > $DATE)"];

[requestTemplate setPredicate:predicateTemplate];

[model setFetchRequestTemplate:requestTemplate forName:@"PublicationsForAuthorSinceDate"];

[requestTemplate release];

Доступ к шаблонам запросов выборки

Листинг 2 Использование шаблонов запросов выборки

NSManagedObjectModel *model = <#Получение модели#>;

NSError *error = nil;

NSDictionary *substitutionDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
    @"Fiona", @"FIRST_NAME", @"Verde", @"LAST_NAME",
    [NSDate dateWithTimeIntervalSinceNow:-31356000], @"DATE", nil];

NSFetchRequest *fetchRequest =
    [model fetchRequestFromTemplateWithName:@"PublicationsForAuthorSinceDate"
            substitutionVariables:substitutionDictionary];

NSArray *results = [aManagedObjectContext executeFetchRequest:fetchRequest error:&error];

Если шаблон не содержит переменных для замены, Вы должны либо:

  • Использовать fetchRequestFromTemplateWithName:substitutionVariables: и передать nil в качестве аргумента переменных или
  • Использавать fetchRequestTemplateForName: и copy результат.

Локализация управляемой объектной модели

Вы можете локализовать большинство аспектов управляемой объектной модели, в том числе сущности, имена свойств и сообщения об ошибках. Важно учитывать, что локализация включает также "локализации в вашем родном языке". Даже если вы не планируете представлять иностранным языком версии вашего приложения, вы можете обеспечить лучший опыт для пользователей, если сообщение об ошибке выведется на "естественном языке", а не на "компьютерном языке" (например, «Имя обязательно к заполнению", вместо "firstName is a required property").

Вы локализуете модель, обеспечивая словарь локализации, который соответствует образцу, указанному в таблице ниже.

Таблица 1 ключи и значения в словарt локализации для управляемой объектной модели

КлючЗначениеПрим.
"Entity/NonLocalizedEntityName""ЛокализованоеИмяСущности" 
"Property/NonLocalizedPropertyName/Entity/EntityName""ЛокализованоеИмяСвойства"1
"Property/NonLocalizedPropertyName""ЛокализованоеИмяСвойства" 
"ErrorString/NonLocalizedErrorString""ЛокализованаяСтрокаОбОшибке" 

Примечание: (1) свойства в различных сущностях с одинаковыми не локализованным именем, но должны иметь различные локализованные имена.

Вы можете получить доступ к словарю локализации методом localizationDictionary. Однако следует отметить, что в Mac OS X версии 10.4, localizationDictionary может вернуть ноль, пока Core Data лениво загружают словарь для своих собственных целей (например, отчеты локализованных сообщений об ошибках).

Строковые файлы

Самый простой способ локализации модели является создание соответствующего строкового файла с именем таким же, как имя файла модели, но с расширением .strings, а не .xcdatamodel расширение (например, для файла модели MyDocument.xcdatamodel соответствующий строковый файл MyDocumentModel.strings, если имя файла вашей модели уже включает в себя суффикс "Model", вы должны добавить еще "Model", так что соответствующий файлу JimsModel.xcdatamodel будет файл JimsModelModel.strings). Формат похож на стандартный строковый файл, который вы используете для локализации, но ключ и значение следует шаблону, показанному в таблице 1.

Строковый файл для модели, которая включает в себя сотрудников предприятия может содержать следующую информацию:

"Entity/Emp" = "Employee";

"Property/firstName" = "First Name";

"Property/lastName" = "Last Name";

"Property/salary" = "Salary";

Программная установка словаря локализации

Вы можете установить локализацинный словарь во время выполнения с помощью setLocalizationDictionary: метода NSManagedObjectModel. Вы должны создать словарь с ключами и значениями, как показано в Таблице 1, и связать его с моделью. Вы должны убедиться, что вы сделали это до использования модели для извлечения или создания управляемых объектов, так как модель является нередактируемой в дальнейшем. Листинг, приведенный в листинге 3 показывает создание в коде модели управляемого объекта, включая словарь локализации. Сущность называется "Run" и представлена ​​во время выполнения Run класса. Сущность имеет два атрибута «date» и «ProcessId» даты и целоuj соответственно. Идентификатор процесса имеет ограничения, его значение не должно быть меньше нуля.

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

NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] init];
NSEntityDescription *runEntity = [[NSEntityDescription alloc] init];
[runEntity setName:@"Run"];
[runEntity setManagedObjectClassName:@"Run"];
[mom setEntities:[NSArray arrayWithObject:runEntity]];
[runEntity release];

NSMutableArray *runProperties = [NSMutableArray array];

NSAttributeDescription *dateAttribute = [[NSAttributeDescription alloc] init];
[runProperties addObject:dateAttribute];
[dateAttribute release];
[dateAttribute setName:@"date"];
[dateAttribute setAttributeType:NSDateAttributeType];
[dateAttribute setOptional:NO];

NSAttributeDescription *idAttribute= [[NSAttributeDescription alloc] init];
[runProperties addObject:idAttribute];
[idAttribute release];
[idAttribute setName:@"processID"];
[idAttribute setAttributeType:NSInteger32AttributeType];
[idAttribute setOptional:NO];
[idAttribute setDefaultValue:[NSNumber numberWithInt:0]];

NSPredicate *validationPredicate = [NSPredicate predicateWithFormat:@"SELF >= 0"];
NSString *validationWarning = @"Process ID < 0";
[idAttribute setValidationPredicates:[NSArray arrayWithObject:validationPredicate]
    withValidationWarnings:[NSArray arrayWithObject:validationWarning]];

[runEntity setProperties:runProperties];

NSMutableDictionary *localizationDictionary = [NSMutableDictionary dictionary];
[localizationDictionary setObject:@"Process ID" forKey:@"Property/processID/Entity/Run"];
[localizationDictionary setObject:@"Date" forKey:@"Property/date/Entity/Run"];
[localizationDictionary setObject:@"Process ID must not be less than 0" forKey:@"ErrorString/Process ID < 0"];
[mom setLocalizationDictionary:localizationDictionary];
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac