Можно ли использовать несколько (двух) постоянных хранилищ с одной объектной моделью, поддерживая отношения друг от друга?
Введение
Мой проект iOS поставляется с постоянным хранилищем Core Data весом около 160 МБ в формате SQLite. Там есть тонна сгруппированной информации, в которой пользователи должны иметь возможность отмечать избранные. Для этого мне нужна (по крайней мере часть) база данных для возможности записи. Но, конечно, постоянные магазины, которые поставляются в комплекте приложений, разработаны только для чтения.
Если вы хотите, чтобы в хранилище были возможности чтения и записи, вы должны скопировать его, например. папке документов приложения. Я не хочу этого делать, потому что тогда приложение будет в два раза больше, тогда как основная часть этой базы данных будет доступна только для чтения. Это будет пустой тратой ресурсов.
Несколько постоянных хранилищ для NSPersistentStoreCoordinator
Вот почему я думал использовать два постоянных магазина. Первая из них будет большой в комплекте, а вторая может быть маленькой в папке документов, сохраняя специальные "любимые" сущности с отношениями к большому хранилищу.
Я знаю, что в этом отношении возможно что-то, но я не могу найти специфику. Следует ли использовать только несколько магазинов, если у вас также есть несколько объектных моделей? Можно ли "распределить" одну объектную модель в двух постоянных хранилищах? При просмотре документов Core Data Programming я не могу найти никакой реальной информации о том, как это установить. Кроме того, книга Маркуса Зарра, похоже, не вникает в эту тему:
В NSPersistentStoreCoordinator можно добавить несколько NSPersistentStore, которые могут быть полезны при работе с данными, разделенными на несколько файлов. Однако в нашем примере у нас есть один файл. (Маркус Зарра: "Основные данные - API Apple для сохранения данных в Mac OS X" страница 71)
Вопрос
Кто мог бы рассказать мне, возможно ли, что я думаю, с Core Data и несколькими постоянными магазинами? И не могли бы вы дать подсказку о том, как достичь этого? Онлайн/автономные ресурсы, которые занимаются этой темой, очень ценятся.
Ответы
Ответ 1
Ответ: да. @Caleb указывает на правильные ресурсы, но заставить его работать все еще довольно неудобно. Я думал, что разместил здесь резюме:
Для двух экземпляров NSPersistentStore
для совместной работы с одной и той же моделью вам необходимо добавить конфигурацию в вашу модель, которая является поднабором подстроки с именами строк:
![Model configurations]()
В модели для сущности, принадлежащей второму магазину, вы добавляете свойство, выбранное для поиска (NSFetchedPropertyDescription
для googlability). Это несколько простая хранимая процедура, и она может выглядеть так:
![NSPredicate format for the fetched property]()
Затем, когда вы добавляете магазины в ваш постоянный координатор хранилища, вы используете строки для аргумента configuration
(более информация о параметрах здесь):
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"ModifyInBackground"
URL:storeURL1
options:options
error:&error]
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"ModifyInMain"
URL:storeURL2
options:options
error:&error]
Наконец, когда вы хотите получить от сущности в магазине B сущность в магазине A, вы запускаете свойство, выбранное вами, например, вы можете вызвать ошибку, просто обратившись к нему.
Примечание. Приобретенное свойство всегда возвращает NSArray, потому что предикат, который вы пишете для установления ссылки, может иметь несколько результатов. Если вы хотите перейти только к одному объекту, вы можете разместить что-то вроде этого в методе-оболочке вашего подкласса NSManagedObject
:
Wallpaper *recordedWallpaper = [record.wallpaper lastObject];
Ответ 2
Да, вы можете использовать несколько магазинов для одной модели, но вы не можете создавать отношения между объектами в разных магазинах. Найдите раздел "Перекрестные хранилища" в" Руководстве по программированию основных данных", в котором говорится, что он рекомендует и рекомендует использовать выбранные свойства, если вам нужно связать объект в одном хранить объект в другом.
Ответ 3
Одна мысль. Возможно, вы захотите создать разные магазины в целом, а также разные постоянные координаторы хранилища для каждого магазина. А затем создайте различные контексты управляемых объектов для каждой из частей модели. Итак, скажем, у меня есть модель с тремя сущностями: студент, колледж и курсы. Предположим, что я хочу хранить студенческие и колледжские объекты в магазине1 и Course in Store2, у меня было бы 2 набора управляемых объектов, которые сохранялись бы и сохранялись. Теперь, учитывая, что у нас не может быть перекрестных резервных отношений, модификация в одном контексте не влияет на другой контекст. Вам не нужно создавать разные модели или связывать их с хранилищами -etc.