Как мне инициализировать хранилище с данными по умолчанию в приложении CoreData?

Делаю приложение для айфона. В этом приложении я просто хочу иметь базу данных, которая будет использоваться в качестве таблицы поиска значений в моем приложении. Единственное, что будет делать база данных, - это предоставить мне нужные мне значения в зависимости от запроса программы. Он не будет производить никаких добавлений или удалений в базе данных. Мой вопрос заключался в том, как мне инициализировать данные по умолчанию в приложении с помощью CoreData. Чтобы при запуске программы в ней уже были все необходимые значения.

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

Спасибо.


person edie    schedule 12.08.2009    source источник


Ответы (4)


Я бы создал простое приложение для Mac, начиная с шаблона для приложения на основе документов Core Data. Скопируйте существующий .xcdatamodel поверх модели по умолчанию в проекте (или добавьте новую модель данных и обязательно переименуйте любое место, которое относится к модели по умолчанию). Откройте файл XIB для окна документа в Interface Builder и перетащите в него элемент Core Data Entity из инспектора библиотеки Interface Builder. В появившемся диалоговом окне выберите объект для отображения и выберите интерфейс для его отображения.

Это позволит создать полностью функциональный интерфейс для добавления, удаления или редактирования свойств этого типа сущности. Все должно быть подключено через привязки какао, чтобы вам не нужно было писать строку кода, чтобы это работало. Таким образом вы можете добавить интерфейсы для каждого типа сущности в своей модели.

Это позволит вам быстро вводить и редактировать данные в документе Core Data, который затем можно сохранить на диск и добавить в качестве ресурса в приложение iPhone. Структуры базы данных SQLite полностью совместимы между настольными компьютерами и реализациями Core Data на iPhone, поэтому я обнаружил, что это быстрый и простой способ тестирования кода iPhone Core Data.

person Brad Larson    schedule 12.08.2009
comment
@BradLarson Похоже, что эта функция (перетаскивание элемента Core Data Entity в представление) больше не поддерживается в XCode4. - person Ali; 02.07.2011
comment
Что произойдет, если вам потребуется перенести базу данных в будущую версию? Придется ли вам по существу перестраивать базу данных по умолчанию для каждой версии модели? Мне любопытно, может быть, лучше заполнить базу данных при первом запуске из некоторых списков свойств, и я хотел бы получить ваш совет по этому поводу. Спасибо, Брэд! - person iwasrobbed; 18.03.2013
comment
@iWasRobbed - в этом случае вы также должны перенести свою связанную базу данных до последней версии. Вы бы не хотели тратить время на обновление при каждой установке iOS. Мои клиенты Mac, которые я создал для этого, смогли обновить базы данных до последней схемы для развертывания в пакетах приложений iOS для более новых версий приложений. - person Brad Larson; 19.03.2013

См. Руководство по программированию основных данных или см. Ниже (копия с PG):

«Как мне инициализировать магазин с данными по умолчанию?

Здесь есть две проблемы: создание данных и обеспечение того, чтобы данные были импортированы только один раз. Есть несколько способов создать данные.

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

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

Вы не должны использовать эту технику в iOS, и только в случае крайней необходимости в Mac OS X. Анализ файла для создания хранилища влечет за собой ненужные накладные расходы. Гораздо лучше создать хранилище Core Data самостоятельно в автономном режиме и использовать его непосредственно в своем приложении. Есть также несколько способов гарантировать, что значения по умолчанию импортируются только один раз:

  • Если вы используете iOS или создаете приложение, не основанное на документах, для Mac OS X, вы можете добавить проверку при запуске приложения, чтобы определить, существует ли файл в том месте, которое вы указали для магазина приложения. Если это не так, вам необходимо импортировать данные. Пример для iOS см. В CoreDataBooks.

  • Если вы создаете приложение на основе документа с помощью NSPersistentDocument, вы инициализируете значения по умолчанию в initWithType: error :.

  • Если есть вероятность, что хранилище (следовательно, файл) может быть создано, но данные не импортированы, вы можете добавить в хранилище флаг метаданных. Вы можете проверить метаданные (используя metadataForPersistentStoreWithURL: error :) более эффективно, чем выполнение выборки (и это не требует от вас жесткого кодирования каких-либо значений данных по умолчанию).

"

Как упоминалось выше, обычно нам нужно создать предварительно заполненное хранилище по умолчанию с кодом, затем использовать его в качестве файла ресурсов и скопировать его из пакета ресурсов в каталог документов, если файл coredata отсутствует. Найдите пример кода CoreDataBooks в своем Xcode Organizer (или Apple Developer Center) и посмотрите - (NSPersistentStoreCoordinator *) метод persistentStoreCoordinator.

person flypig    schedule 18.07.2012

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

person Clifton Crawley    schedule 25.03.2012

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

person Louis Gerbarg    schedule 12.08.2009
comment
Это довольно старый ответ. Это все еще правда? Если я не собираюсь писать в предварительно заполненную базу данных, могу ли я просто прочитать ее прямо из ресурсов? - person Suragch; 17.08.2015