Доставка предварительно заполненной БД SQLite в приложении. Путь БД при запуске - PullRequest
0 голосов
/ 16 ноября 2011

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

Я заканчиваю приложение, которое в основном БД. Я отправлю БД в приложении. Все работает хорошо, но теперь я пришел к проблеме. Когда приложение установлено, оно должно создать базу данных на устройстве. Итак, я перетащил БД в папку «Supporting Files» в моем проекте 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 = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @ "Database.sqlite"];

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

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

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

1 Ответ

2 голосов
/ 16 ноября 2011

Вы уверены, что [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]

...