Можно ли использовать несколько (двух) постоянных хранилищ с одной объектной моделью, поддерживая отношения друг от друга?

Введение

Мой проект 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.