У вас должно быть два постоянных магазина. Хранилище только для чтения, которое находится в вашем комплекте, и хранилище для чтения / записи, которое находится в каталоге документов.
Вы можете добавить оба магазина в NSPersistentStoreCoordinator
и получить к ним доступ из одного NSManagedObjectContext
.
Если оба хранилища имеют одну и ту же сущность, вам нужно позвонить -assignObject:toPersistentStore:
, чтобы сообщить Core Data, в какое хранилище сохранить сущность. Если каждая базовая модель имеет разные сущности, то в этом нет необходимости.
Кроме того, вы можете «связать» заметки с рецептом только для чтения, убедившись, что каждый рецепт имеет уникальный идентификатор (который вы создаете), и записка хранит его, чтобы вы могли использовать извлеченное свойство для извлечения соответствующего рецепта и ассоциированные заметки.
ObjectID
Во-первых, не используйте -objectID
для связи между магазинами. Он может меняться и меняется во время миграции (и в других случаях), что сделает вашу миграцию НАМНОГО ужаснее, чем нужно.
Миграция
Миграция очень проста. Если вам нужно изменить модель данных только для чтения, просто измените ее и включите новую версию в ваше приложение.
Если вам нужно изменить модель чтения-записи, создать новую модель, использовать автоматическую миграцию во время тестирования, а когда вы будете готовы к отправке, напишите NSMappingModel
из старой версии в новую версию.
Поскольку два постоянных хранилища (и связанные с ними модели) не связаны, риск миграции очень мал. Единственный «улов» заключается в том, что код шаблона для Core Data не сможет автоматически разрешить исходную модель для миграции. Чтобы решить эту проблему, вам нужно немного подойти и помочь:
- Встаньте в пункт назначения
NSPersistentStoreCoordinator
и следите за ошибкой. Если вы получили ошибку миграции:
- Найдите исходные модели и создайте экземпляр
NSManagedObjectModel
со всеми соответствующими исходными моделями.
- Создайте экземпляр
NSMigrationManager
и передайте ему исходную и целевую модели
- Позвоните
- migrateStoreFromURL: type: options: withMappingModel: toDestinationURL: destinationType: destinationOptions: error:
, чтобы начать миграцию
- Прибыль!
Немного больше работы по переносу таким способом. Если ваши две модели сильно разделены, вы можете сделать это немного по-другому, но для этого потребуется тестирование (как и все):
- Отловить ошибку миграции
- Вставьте новый
NSPersistentStoreCoordinator
с просто постоянным хранилищем (и моделью), которое необходимо перенести.
- Пусть тот мигрирует.
- Снесите это
NSPersistentStoreCoordinator
и попытайтесь снова поднять свой основной NSPersistentStoreCoordinator
.