Основные данные: как использовать базу данных по умолчанию? - PullRequest
2 голосов
/ 13 декабря 2011

Я создал приложение iOS по умолчанию в XCode с Core Data.Я поместил файл myDatabase.sqllite по умолчанию в свой проект, который я хотел бы использовать при первом запуске приложения, поэтому каждому пользователю не нужно извлекать все новые элементы.

Как я могу изменитькод в AppDelegate.m для использования моего стандартного myDatabase.sqllite при первом запуске приложения?

Ответы [ 2 ]

4 голосов
/ 13 декабря 2011

Я обычно создаю свое постоянное хранилище и предварительно загружаю его в симулятор, что приятно и быстро по сравнению с устройством, особенно если данные поступают из сети или XML.Затем я копирую вывод (.sqlite) этого файла в комплект проекта.

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

Я полагаю, что именно об этом говорится в документации @simon, когда говорится, что нужно создать отдельное постоянное хранилище и скопировать его на место.

Обновлено
Взгляните на NSFileManager имеет следующий метод

- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error

Обсуждение
... Если файл с таким именем уже существует в dstPath, этоМетод прерывает попытку копирования и возвращает соответствующую ошибку.

, поскольку в силу предыдущего факта вам, возможно, не удастся просто использовать этот метод и не пытаться выполнить

- (BOOL)fileExistsAtPath:(NSString *)path

что может привести к гонке.

Поэтому перед загрузкой NSPersistentStoreCoordinator вам нужно сделать что-то вроде:

NSString *seededDatabasePath = [[NSBundle mainBundle] pathForResource:@"myDB" ofType:@"sqlite"];

NSError *error = nil;
BOOL didCopy = [[NSFileManager defaultManager] copyItemAtPath:seededDatabasePath
                                                       toPath:fileDatabasePath
                                                        error:&error];

if (!didCopy) {
    // .. make sure that the error isn't something bad
}
1 голос
/ 13 декабря 2011

Я не уверен, что вы можете сделать это. Обычный метод - заполнение ваших таблиц базовых данных из XML или PLists во время выполнения. Лично у меня есть штамп версии в настройках пользователя по умолчанию, который я проверяю при запуске приложения. Если он не найден (или неправильная версия), я запускаю анализатор XML, чтобы получить данные по умолчанию.

Мне интересно посмотреть на результат этого, чтобы увидеть, нашел ли кто-нибудь лучший метод.

РЕДАКТИРОВАТЬ: Только что нашел это в руководстве по программированию Mac и предположим, что это похоже на iPhone ...

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

Для небольших наборов данных вы можете создавать управляемые объекты непосредственно в Код.

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

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

Кроме того, я тоже нашел это ...

Как использовать существующую базу данных SQLite с Core Data?

Вы не. Хотя Core Data поддерживает SQLite как одно из его постоянных хранилищ типы, формат базы данных является частным. Вы не можете создать SQLite базы данных с использованием собственного API SQLite и использовать его непосредственно с Core Data (и при этом вы не должны манипулировать существующим хранилищем Core Data SQLite, используя родной SQLite API). Если у вас есть база данных SQLite, вам нужно импортировать его в хранилище Core Data (см. «Эффективный импорт» Данные»).

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