Как мне добавить файлы в папку ресурсов в XCode?

Я хочу добавить базу данных sqlite в XCode 4 (относится и к XCode 3). В учебниках говорится о добавлении файла .db в папку ресурсов, и я полагаю, что он копируется в ~ / Library / Application Support / iPhone Simulator / 4.2 / Applications / {some-id} / Documents / во время сборки где найти файл с NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) и т. д.

Однако в XCode 4 нет папки с видимыми ресурсами.

Я пробовал добавить файл с помощью команды Добавить файл ..., а затем он появляется в Цели> Имя приложения> Копировать ресурсы пакета, но всегда пустой файл .db появляется в указанной выше папке документов (которую я затем вручную заменяю - очевидно не правильный подход!)

(из-за характера данных я использую sqlite вместо CoreData)


person Gazzer    schedule 17.02.2011    source источник


Ответы (2)


вам нужно начать добавлять свой db в свой проект-xcode, поэтому он будет добавлен в папку вашего пакета, где вы можете найти его с помощью кода:

[NSBundle mainBundle]

Это единственная папка, в которую вы можете добавлять файлы через xcode, когда вы «создаете» свое приложение (в конечном итоге с вложенными папками, но не с «системными» папками в качестве «документов»), теперь вам просто нужно иметь в виду, что основная папка пакета - это просто " только для чтения ", поэтому вы не можете использовать там свою базу данных с правами записи. Итак, нормальный способ:

1) когда вы хотите использовать свою базу данных, проверьте с помощью кода, существует ли она в папке app: documents. Конечно, в первый раз это не так, поэтому

2) скопируйте его из основного пакета

- (BOOL)transferDb {
    NSError **error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourData.db"]; 

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath: path])
    {
        NSString *bundle =  [[ NSBundle mainBundle] pathForResource:@"preferenze" ofType:@"plist"];
        [fileManager copyItemAtPath:bundle toPath:path error:error];
        return YES;
    }
    return NO;
}

3) используйте его (ж / б) в папке с документами

ps: и (конечно) имейте в виду, что когда вы используете / редактируете / записываете db в iPhone / симуляторе, возможно, добавляете записи, тот, который в основном пакете, и, конечно, тот, который в вашем Mac / проекте, не будет обновлен , никакие записи не будут добавлены к нему, поэтому, если по какой-либо причине вы удалите свое приложение на iPhone / симуляторе (или «очистите все цели» с помощью меню «build» xCode), метод проверки / копирования скопирует «девственную» базу данных в папку с документами снова, поэтому вы потеряете все свои изменения ...

person meronix    schedule 17.02.2011
comment
Я просто хотел бы узнать, действительно ли этот код все еще действителен для IOS 8 и Yosemite, поскольку расположение файлов SQLite изменилось. - person clive dancey; 01.12.2014

Будьте осторожны с объемом данных, которые вы помещаете в папку «Документы», это предназначено для пользовательских данных, и, поскольку для этих данных будет выполнено резервное копирование с помощью iCloud, Apple ограничила объем данных, которые приложение может хранить и использовать в папке «Документы».

Мое приложение было отклонено за использование таким образом базы данных SQLite размером 6 МБ. Вместо этого скопируйте его в каталог кэшей: NSCachesDirectory.

Или запретите резервное копирование файла: https://developer.apple.com/library/ios/#qa/qa1719/_index.html.

person StuR    schedule 23.04.2012