Можно ли использовать несколько (двух) постоянных хранилищ с одной объектной моделью, поддерживая отношения друг от друга?
Введение
Мой проект iOS поставляется с постоянным хранилищем Core Data весом около 160 МБ в формате SQLite. Там есть тонна сгруппированной информации, в которой пользователи должны иметь возможность отмечать избранные. Для этого мне нужна (по крайней мере часть) firebase database для возможности записи. Но, конечно, постоянные магазины, которые поставляются в комплекте приложений, разработаны только для чтения.
Если вы хотите, чтобы в хранилище были возможности чтения и записи, вы должны скопировать его, например, в папку документов приложения. Я не хочу этого делать, потому что тогда приложение будет в два раза больше, тогда как основная часть этой базы данных будет доступна только для чтения. Это будет пустой тратой ресурсов.
- Поймать Ctrl-C в C
- Как получить длину массива в C? Решение «sizeof»?
- Использование \ b и \ r в C
- возвращая несколько значений из функции
- Проблема с поплавком на C
Несколько постоянных хранилищ для NSPersistentStoreCoordinator
Вот почему я думал использовать два постоянных магазина. Первая из них будет большой в комплекте, а вторая может быть маленькой в папке с документами, сохраняя специальные «любимые» объекты с отношениями к большому магазину.
Я знаю, что в этом отношении возможно что-то, но я не могу найти специфику. Следует ли использовать только несколько магазинов, если у вас также есть несколько объектных моделей? Можно ли «распределить» одну объектную модель в двух постоянных хранилищах? При просмотре документации по основным данным , я не могу найти никакой реальной информации о том, как ее установить. Также книга Маркуса Зарры, похоже, не вникает в эту тему:
В NSPsistentStoreCoordinator можно добавить несколько NSPersistentStore, которые могут быть полезны при работе с данными, разделенными на несколько файлов. Однако в нашем примере у нас есть один файл. ( Маркус Зарра: «Основные данные – API Apple для сохранения данных в Mac OS X» на стр. 71 )
Вопрос
Кто мог бы рассказать мне, возможно ли то, что я думаю, с Core Data и несколькими постоянными магазинами? И не могли бы вы дать подсказку о том, как достичь этого? Онлайн-ресурсы / автономные ресурсы, которые занимаются этой темой, очень ценятся.
- case switch: ошибка: метка case не сводится к целочисленной константе
- Добавление или вычитание цвета из изображения в pictureBox с использованием C #
- Какие операции и функции на +0.0 и -0.0 дают разные арифметические результаты?
- Разница между int и char в getchar / fgetc и putchar / fputc?
- Квадрат числа определяется с помощью #define
- Почему запись в строковый литерал в этой программе C segfault?
- хранение денежных сумм в mysql
- Что возвращает sizeof (имя функции)?
Ответ – да. @Caleb указывает на правильные ресурсы, но заставить его работать все еще довольно неудобно. Я думал, что я бы разместил резюме здесь:
Для двух экземпляров NSPersistentStore
для совместной работы с одной и той же моделью вам необходимо добавить конфигурацию к вашей модели, которая является поднабором подстроки с именами строк:
В модели для объекта, принадлежащего второму хранилищу, вы добавляете NSFetchedPropertyDescription
свойство ( NSFetchedPropertyDescription
для googlability). Это несколько простая хранимая процедура, и она может выглядеть так:
Затем, когда вы добавляете магазины в ваш постоянный координатор хранилища, вы используете строки для аргумента 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.