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

Введение

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

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

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

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

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

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

Вопрос

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

Ответы [ 3 ]

46 голосов
/ 18 ноября 2012

Ответ - да.@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];
5 голосов
/ 08 марта 2011

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

1 голос
/ 13 апреля 2011

Одна мысль: вам может потребоваться создать разные магазины в целом, а также разные постоянные координаторы магазинов для каждого магазина. И затем создайте различные контексты управляемого объекта для каждой части модели. Итак, скажем, у меня есть модель с 3 объектами: студент, колледж и курсы. Предположим, что я хочу хранить объекты Student и College в store1 и Course in Store2, у меня будет 2 набора managedObjectContext, pesistent store и persistent cordinator. Теперь, учитывая, что у нас не может быть взаимосвязей между магазинами, модификации в одном контексте не влияют на другой контекст. Вам не нужно создавать разные модели или связывать их с магазинами -etc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...