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

Введение

Мой проект iOS поставляется с постоянным хранилищем Core Data весом около 160 МБ в формате SQLite. Там есть тонна сгруппированной информации, в которой пользователи должны иметь возможность отмечать избранные. Для этого мне нужна (по крайней мере часть) firebase database для возможности записи. Но, конечно, постоянные магазины, которые поставляются в комплекте приложений, разработаны только для чтения.

Если вы хотите, чтобы в хранилище были возможности чтения и записи, вы должны скопировать его, например, в папку документов приложения. Я не хочу этого делать, потому что тогда приложение будет в два раза больше, тогда как основная часть этой базы данных будет доступна только для чтения. Это будет пустой тратой ресурсов.

Несколько постоянных хранилищ для NSPersistentStoreCoordinator

Вот почему я думал использовать два постоянных магазина. Первая из них будет большой в комплекте, а вторая может быть маленькой в ​​папке с документами, сохраняя специальные «любимые» объекты с отношениями к большому магазину.

Я знаю, что в этом отношении возможно что-то, но я не могу найти специфику. Следует ли использовать только несколько магазинов, если у вас также есть несколько объектных моделей? Можно ли «распределить» одну объектную модель в двух постоянных хранилищах? При просмотре документации по основным данным , я не могу найти никакой реальной информации о том, как ее установить. Также книга Маркуса Зарры, похоже, не вникает в эту тему:

В NSPsistentStoreCoordinator можно добавить несколько NSPersistentStore, которые могут быть полезны при работе с данными, разделенными на несколько файлов. Однако в нашем примере у нас есть один файл. ( Маркус Зарра: «Основные данные – API Apple для сохранения данных в Mac OS X» на стр. 71 )

Вопрос

Кто мог бы рассказать мне, возможно ли то, что я думаю, с Core Data и несколькими постоянными магазинами? И не могли бы вы дать подсказку о том, как достичь этого? Онлайн-ресурсы / автономные ресурсы, которые занимаются этой темой, очень ценятся.

Ответ – да. @Caleb указывает на правильные ресурсы, но заставить его работать все еще довольно неудобно. Я думал, что я бы разместил резюме здесь:

Для двух экземпляров NSPersistentStore для совместной работы с одной и той же моделью вам необходимо добавить конфигурацию к вашей модели, которая является поднабором подстроки с именами строк:

Конфигурации моделей

В модели для объекта, принадлежащего второму хранилищу, вы добавляете NSFetchedPropertyDescription свойство ( NSFetchedPropertyDescription для googlability). Это несколько простая хранимая процедура, и она может выглядеть так:

Формат NSPredicate для выбранного объекта

Затем, когда вы добавляете магазины в ваш постоянный координатор хранилища, вы используете строки для аргумента 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 вашего подclassа NSManagedObject :

 Wallpaper *recordedWallpaper = [record.wallpaper lastObject]; 

Да, вы можете использовать несколько магазинов для одной модели, но вы не можете создавать отношения между объектами в разных магазинах. Найдите раздел « Перекрестные хранилища » в Руководстве по программированию основных данных, в котором говорится, что он рекомендует и рекомендует использовать выбранные свойства, если вам нужно связать объект в одном хранилище с объектом в другом.

Одна мысль. Возможно, вы захотите создать разные магазины, а также разные постоянные координаторы хранилища для каждого магазина. А затем создайте различные контексты управляемых объектов для каждой из частей модели. Итак, скажем, у меня есть модель с тремя сущностями: студент, колледж и курсы. Предположим, что я хочу хранить студенческие и колледжские объекты в магазине1 и Course in Store2, у меня было бы 2 набора управляемых объектов, которые сохранялись бы и сохранялись. Теперь, учитывая, что у нас не может быть перекрестных резервных отношений, модификация в одном контексте не влияет на другой контекст. Вам не нужно создавать разные модели или связывать их с хранилищами -etc.

  • Использование транзакций или SaveChanges (false) и AcceptAllChanges ()?
  • Изменение строкового литерала
  • Как представить 0,1 в арифметике с плавающей точкой и десятичной запятой
  • Как проверить, соответствует ли значение строке
  • Возвращаемое значение оператора «==» в C
  • Почему getchar () не распознает return как EOF на консоли?
  • Как преобразовать символ ASCII в CGKeyCode?
  • Присвоение отрицательных чисел неподписанному int?
  • Использование int для типов символов при сравнении с EOF
  • Массивы, распадающиеся на указатели
  • void main () {if (sizeof (int)> -1) printf ("true"); else printf ("false"); ;
  • Давайте будем гением компьютера.