Доставка предварительно заполненной базы данных SQLite в приложении. Путь к БД при запуске

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

Я заканчиваю приложение, которое в основном представляет собой БД. Я отправлю БД в приложении. Все работает хорошо, но вот я подошла к проблеме. Когда приложение установлено, ему необходимо создать базу данных на устройстве. Итак, я перетащил БД в папку «Вспомогательные файлы» в моем проекте Xcode (кстати, все еще Xcode 4.1). Я перешел к файлу AppDelegate.m и поискал метод (NSPersistentStoreCoordinator *) persistentStoreCoordinator {}.

Я подставил строку:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Database.sqlite"];

для этого кода:

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Database.sqlite"];
NSLog(@"%@", storePath);

NSURL *storeURL = [NSURL fileURLWithPath:storePath];

    // Put down default db if it doesn't already exist
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Database" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
}

Я получил это из учебника Рэя Вендерлиха .

Дело в том, что компилятор выдает мне предупреждение на строчке

NSString * storePath = [[собственный каталог документов приложения] stringByAppendingPathComponent: @ "Database.sqlite"];

это говорит мне, что «NSURL может не отвечать на 'stringByAppendingPathComponent' и, на самом деле, приложение вылетает из-за этого. Что интересно, пример из учебника вообще не дает никаких предупреждений.

Кто-нибудь может помочь мне в том, что мне не хватает?

Заранее спасибо!


person Marcal    schedule 15.11.2011    source источник


Ответы (1)


Вы уверены, что [self applicationDocumentsDirectory] возвращает NSString? Если нет, попробуйте это

- (NSString *)applicationDocumentsDirectoryString {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}

И измените [self applicationDocumentsDirectory] на [self applicationDocumentsDirectoryString]

person Scott Bossak    schedule 15.11.2011
comment
Хороший звонок! это не NSString, а NSURL. Интересно, почему они это изменили. В любом случае, я пробовал то, что вы предлагаете, и компиляторы не выдают ошибок, но вылетает при запуске с: Не удалось зарегистрировать companyName.AppName на сервере начальной загрузки. Ошибка: неизвестный код ошибки. Обычно это означает, что другой экземпляр этого процесса уже был запущен или завис в отладчике. Текущий язык: авто; в настоящее время цель-c - person Marcal; 16.11.2011
comment
Хорошо, неважно. Речь шла только о перезагрузке симулятора. Большое спасибо, Скотт! - person Marcal; 16.11.2011
comment
Каждый раз, когда я вношу большие изменения, я делаю чистую сборку на всякий случай. И удалите приложение с симулятора / устройства. - person Scott Bossak; 16.11.2011