Инициализация хранилища и загрузка данных

Эта статья предоставляет подробную информацию того, как инициализировать персистентное хранилище и загрузить данные из URL.

Инициализация хранилища

Когда Вы добавляете хранилище к персистентному координатору хранилища, хранилище инициализируется с initWithPersistentStoreCoordinator:configurationName:URL:options:. После того, как хранилище инициализируется, оно получает запрос от персистентного координатора хранилища для загрузки его данных через load: метод.

Вы не обязаны реализовывать initWithPersistentStoreCoordinator:configurationName:URL:options:— в некоторых ситуациях будет достаточна реализация по умолчанию. Если действительно необходимо обеспечить дополнительную инициализацию, однако, необходимо рассмотреть это initWithPersistentStoreCoordinator:configurationName:URL:options: вызывается и для существующих хранилищ и для новых хранилищ.

Ваша реализация initWithPersistentStoreCoordinator:configurationName:URL:options: должен быть в состоянии обработать быть инициализированным с a nil URL и URL, указывающий на файл нулевой длины. Последние подачи как индикатор, что новое хранилище должно быть создано в указанном расположении и позволяет Вам надежно создавать файлы резервирования в известных расположениях, которые могут тогда быть переданы Базовым Данным для построения хранилищ.

Загрузка файла

load: метод ответственен за получение данных от URL, указанного для хранилища и создания необходимых объектов. Для каждого элемента в хранилище необходимо создать:

Как только все узлы были созданы, Вы регистрируете их в использовании хранилища addCacheNodes:.

Как пример, рассмотрите хранилище со следующим содержанием:

Person,Robert,Tibbot,86349382003
Person,Jeff,Hancock,5987749473
Person,Derek,Benson,7987082467
Person,George,Andronov,7987082467

Справочные данные

Объект справочных данных является просто объектным представлением данных в хранилище. Например, Вы могли бы создать NSMutableDictionary объект для каждого Лица:

{ firstName = @"Robert", lastName = @"Tibbot", id = 86349382003 }
{ firstName = @"Jeff", lastName = @"Hancock" id = 5987749473 }
{ firstName = @"Derek", lastName = @"Benson" id = 7987082467 }
{ firstName = @"George", lastName = @"Andronov" id = 3492475026 }

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

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

NSEntityDescription *personEntity =
    [[[[self persistentStoreCoordinator] managedObjectModel]
        entitiesByName] objectForKey:@"Person"];
NSManagedObjectID *moID =
    [self objectIDForEntity:personEntity referenceObject:[personDictionary objectForKey: @"id"]];

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

Узел кэша

Вы создаете узел кэша с помощью NSAtomicStoreCacheNode метод initWithObjectID:.

NSAtomicStoreCacheNode *personNode =
                [[NSAtomicStoreCacheNode alloc] initWithObjectID:moID];

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

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

[personNode setPropertyCache:personDictionary];

Значения в узле кэша должны быть:

  • Для значения атрибута, экземпляра типа атрибута, поддерживаемого Базовыми Данными (см. NSAttributeDescription);

  • Для к - одно отношение, другой экземпляр узла кэша;

  • Для к - многие отношение, набор связанных узлов кэша.

Пример

Рассмотрите хранилище со следующим содержанием:

Person::first:Robert:last:Tibbot:id:86349382003
Person::first:Jeff:last:Hancock:id:5987749473
Person::first:Derek:last:Benson:id:7987082467
Person::first:George:last:Andronov:id:7987082467

load: метод мог бы сначала проанализировать файл для создания NSMutableDictionary объект для каждого Лица:

{ firstName = @"Robert", lastName = @"Tibbot", id = 86349382003 }
{ firstName = @"Jeff", lastName = @"Hancock", id = 5987749473 }
{ firstName = @"Derek", lastName = @"Benson", id = 7987082467 }
{ firstName = @"George", lastName = @"Andronov", id = 3492475026 }

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

Вы тогда создаете Базовые Объекты данных следующим образом:

NSEntityDescription *personEntity =
    [[[[self persistentStoreCoordinator] managedObjectModel]
        entitiesByName] objectForKey:@"Person"];
 
NSMutableSet *cacheNodes = [NSMutableSet set];
 
NSDictionary *objectData;
id referenceObject;
NSManagedObjectID *moID;
NSAtomicStoreCacheNode *personNode;
 
for (NSMutableDictionary *personDictionary in personDictionaries) {
 
    objectData = [personDictionary mutableCopy];
    // The managed object itself should not store the value of the identifier as a property.
    referenceObject = [personDictionary valueForKey:@"id"];
    [objectData removeObjectForKey: @"id"];
    moID = [self objectIDForEntity:personEntity
                                referenceObject:referenceObject];
 
    personNode = [[NSAtomicStoreCacheNode alloc] initWithObjectID:moID];
    [personNode setPropertyCache:objectData];
    [cacheNodes addObject:personNode];
}
 
[self addCacheNodes:cacheNodes];