Одно приложение с двумя базами данных - PullRequest
1 голос
/ 09 декабря 2011

Приложение для iPhone в настоящее время использует базовые данные для сохранения записей роста, созданных пользователем.Я пытаюсь добавить файл .sqlite в приложение, в котором хранятся данные о среднем росте, чтобы я мог использовать Core Plot, чтобы показать пользователю, как его рост сравнивается со средним.

  • Мое приложение работаетидеально подходит для хранения и извлечения данных пользователя.
  • Я написал служебное приложение, которое создает файл .sqlite, содержащий средние данные
  • Я скопировал файлы классов данных среднего роста, модель данныхи файл .sqlite в мое основное приложение.

Примечание: усредненные данные не должны быть доступны для записи.

После долгих поисков переполнения стека и бесчисленного количества Googleпришел к выводу, что я хочу реализовать два PersistentStoreCoordinators: один для введенных пользователем данных (readwrite) и один для средних данных (только для чтения).Это лучший курс?

Если так, я не знаю, с чего начать.В настоящее время мои основные методы стека данных находятся в моем AppDelegate.m (где Xcode их поместил).Такое чувство, что я должен переместить их в лучшее место, если я собираюсь добавить к ним много, но я не знаю, где это лучшее место может быть.И кроме того, я не знаю, с чего мне начать пытаться добавить новый постоянный магазин.

Спасибо за помощь!

Редактировать для уточнения: Если мое предложение о создании двух PersistentStoresправильный путь, как мне это сделать?Если это не лучший маршрут, что мне делать?

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

Вот несколько примеров:

Если вы планируете использовать разные комбинации сущностей в разных магазинах, вам необходимо добавить «конфигурации» в вашу MOM.Для получения дополнительной информации см. Руководство по программированию основных данных> Модели управляемых объектов.

Обычное место для хранения фактической базы данных находится в «каталоге поддержки приложений», который находится в Пользователь> Библиотека> Поддержка приложений> NameOfYourApp.Строка, представляющая этот путь, - это то, что возвращает автоматически сгенерированный метод applicationSupportDirectory.(К сожалению, вы спрашиваете об iOS. Там метод applicationDocumentsDirectory возвращает путь к песочнице.)

Автоматически сгенерированный метод доступа persistentStoreCoordinator - это то место, куда добавляется хранилище.Вы можете сделать его разные версии, чтобы добавить разные хранилища, или добавить свойство к делегату приложения, которое вы используете, чтобы отслеживать, с каким хранилищем работать.Например, вместо создания URL-адреса, указывающего на файл сохраненных данных по умолчанию, вы можете сделать следующее:

NSURL *url = [NSURL fileURLWithPath: [applicationSupportDirectory stringByAppendingPathComponent: @“nameOfStoreToAdd.sqlite”]];

В вызове addPersistentStoreWithType вы захотите использовать NSSQLiteStoreType, а нечем по умолчанию NSXMLStoreType.(Если вы когда-нибудь получите NSUnderlyingException = «Файл по пути, по-видимому, не является базой данных SQLite.», Это проблема.) И если вы настроили различные конфигурации для MOM, вы захотите добавить строкучтобы определить configuration для этого хранилища. Позже вы можете посмотреть, как настроить словарь опций для параметра options.

Автоматически сгенерированный managedObjectContext - это то, что вызывает метод доступа persistentStoreCoordinator.опять же, вам понадобятся разные версии этого или некоторого свойства, с которым обращаются, чтобы управлять тем, как вызывается метод доступа storeCoordinator.

Когда вы хотите переключить базы данных, вы сначала сохраняете текущий контекст, устанавливаете его иstoreCoordinator, равный nil, затем вызовите метод доступа к контексту таким образом, чтобы получить другое хранилище (или, возможно, вы можете оставить несколько контекстов открытыми одновременно. Просто убедитесь, что вы установили отдельные свойства для их хранения и их storeCoordinators.)

Делегат приложения доступен из любой части.вашего приложения, просто вызвав [[NSApplication sharedApplication] delegate], поэтому имеет смысл оставить этот код там.Если это становится слишком длинным, вы всегда можете разбить его на категорию.

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

1 голос
/ 11 декабря 2011

Я решил свою проблему. Вот что я сделал:

  • создать модель данных для второй базы данных
  • в методе appDelegate managedObjectModel: добавить код для объединения двух моделей (NSManagedObjectModel modelByMergingModels:)
  • в методе appDelegate didFinishingLaunchingWithOptions: добавьте код, чтобы определить, существует ли база данных. Если он не существует, сгенерируйте данные.

ПРИМЕЧАНИЕ: вам не нужно создавать базу данных перед генерацией данных. Это будет сделано для вас автоматически при создании нового объекта.

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

0 голосов
/ 09 декабря 2011

Вам потребуется настроить Координатор постоянного хранилища для использования нескольких постоянных хранилищ. Взгляните на определение Конфигурации для вашей объектной модели, чтобы контролировать, какие объекты модели хранятся в каком постоянном хранилище.

...