Ошибка говорит, что исходный путь - ноль - PullRequest
1 голос
/ 16 января 2012

Я новичок в разработке приложений для iOS.

Я пытаюсь создать пример приложения БД, которое сохраняет записи в БД и извлекает из них данные.

Приложение работает хорошо, когда я тестирую на симуляторах. Я создал локальную базу данных, а также, когда это необходимо, я делаю ее копию программно. Также я проверил, что локальная БД упоминается в «Ресурсах комплектов копирования».

Но я получаю сообщение об ошибке: «* Завершение приложения из-за необработанного исключения« NSInvalidArgumentException », причина:« * - [NSFileManager copyItemAtPath: toPath: error:]: исходный путь равен nil »» .

Я думаю, что фрагмент кода, который вызывает эту проблему, "[FileManager copyItemAtPath: databasePathFromApp toPath: ошибка DBPath: nil];"

Он отлично работает на симуляторах, но не при тестировании на устройстве.

Ожидается помощь.

Мой код,

- (id)init {

    self = [super init];

    //Datbase Name
    DBName=@"Person.sqlite3";

    //Getting DB Path
    NSArray *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDir = [documentsPath objectAtIndex:0];

    DBPath=[documentsDir stringByAppendingPathComponent:DBName ];
    //DBPath = [[NSString alloc] initWithString: [documentsDir stringByAppendingPathComponent:DBName]];
    NSLog(@"DBPath is  %@",DBPath);

    return self;

}


-(void)checkAndCreateDB{

    BOOL Success;

    //NSFileManager maintains File
    NSFileManager *FileManager = [NSFileManager defaultManager];
    NSLog(@"line 1");

    //Checks Database Path
    Success = [FileManager fileExistsAtPath:DBPath];
    NSLog(@"line 2");

    //If file exists, it returns true
    if(Success)return;
    NSLog(@"line 3");

    //NSString *databasePathFromApp = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:DBName];

    // Get the path to the database in the application package
    NSString *databasePathFromApp=[[NSBundle mainBundle] pathForResource:@"Person.sqlite3" ofType:@"sqlite3"];
    NSLog(@"line 4");

    [FileManager copyItemAtPath:databasePathFromApp toPath:DBPath error:nil];
    //[FileManager release];
    NSLog(@"line 5");

}

Мое приложение вылетает при тестировании на устройстве после строки NSLOG (строка 4); Но хорошо работает в симуляторе.

Большое спасибо Пракаш

Ответы [ 2 ]

0 голосов
/ 16 января 2012

изменить эту строку

NSString *databasePathFromApp=[[NSBundle mainBundle] pathForResource:@"Person.sqlite3" ofType:@"sqlite3"];

до

NSString *databasePathFromApp=[[NSBundle mainBundle] pathForResource:@"Person" ofType:@"sqlite3"];

также обратите внимание на использование заглавных букв, устройства iOS чувствительны к регистру, а на симуляторе вы получите неправильную заглавную букву

0 голосов
/ 16 января 2012

Устройство не может записывать в комплект приложений, вам необходимо использовать каталог Documents.

Вот как получить путь к папке Documents:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];

Если у вас естьИсходная БД в комплекте приложения скопируйте его в Документы при первом запуске.

...