Инициализация хранилища и загрузка данных
Эта статья предоставляет подробную информацию того, как инициализировать персистентное хранилище и загрузить данные из URL.
Инициализация хранилища
Когда Вы добавляете хранилище к персистентному координатору хранилища, хранилище инициализируется с initWithPersistentStoreCoordinator:configurationName:URL:options:
. После того, как хранилище инициализируется, оно получает запрос от персистентного координатора хранилища для загрузки его данных через load:
метод.
Вы не обязаны реализовывать initWithPersistentStoreCoordinator:configurationName:URL:options:
— в некоторых ситуациях будет достаточна реализация по умолчанию. Если действительно необходимо обеспечить дополнительную инициализацию, однако, необходимо рассмотреть это initWithPersistentStoreCoordinator:configurationName:URL:options:
вызывается и для существующих хранилищ и для новых хранилищ.
Ваша реализация initWithPersistentStoreCoordinator:configurationName:URL:options:
должен быть в состоянии обработать быть инициализированным с a nil
URL и URL, указывающий на файл нулевой длины. Последние подачи как индикатор, что новое хранилище должно быть создано в указанном расположении и позволяет Вам надежно создавать файлы резервирования в известных расположениях, которые могут тогда быть переданы Базовым Данным для построения хранилищ.
Загрузка файла
load:
метод ответственен за получение данных от URL, указанного для хранилища и создания необходимых объектов. Для каждого элемента в хранилище необходимо создать:
Объект справочных данных, содержащий данные от элемента
Управляемый объект ID
Атомарный узел кэша хранилища
Как только все узлы были созданы, Вы регистрируете их в использовании хранилища 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]; |