копирование из основного пакета создает файл размером ноль кб - PullRequest
0 голосов
/ 21 ноября 2011

В процессе запуска моего приложения я копирую файлы комплекта в каталог документов.

Это нормально работает для трех из четырех моих файлов, но четвертый создает файл Zero KB.

работает на iOS 5.0 sim. Я несколько раз чистил сборку и проверял правильность заглавных букв в имени файла.

файл появляется в каталоге, но имеет нулевой кб и должен быть 24K

любая помощь приветствуется.

-(BOOL) CheckDBs: (NSString *)dbname 
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];   
    NSString *dbPath = [documentsDir stringByAppendingPathComponent:dbname];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL success = [fileManager fileExistsAtPath: dbPath];
    NSLog(@"AppDelegate CheckDatabase: %@ = %i", dbPath, success);

    if (success) {
        //NSLog(@"return YES");
        return YES;
    }
    else {
        return NO;  
    }   
}  // Complete - checks if files exist in the User Documents directory

-(void) copyDBs: (NSString *) dbname 
{
    //Using NSFileManager we can perform many file system operations.
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    NSString *dbPath = [documentsDir stringByAppendingPathComponent:dbname];        
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbname];
    BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

    if (success) {

        // Version 4.0 code
        //NSDictionary *attribs = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];
        //success = [fileManager setAttributes:attribs ofItemAtPath:dbPath error:&error];
        NSLog(@"AppDelegate copyDatase: %@ = %d", dbPath, success); 
    }

    //NSLog(@"AppDelegate copyDatase: %@ = %d", dbPath, success);   
    if (!success) {

        NSLog(@"Failed to copy database: '%@'", [error localizedDescription]);
        //  NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }   
}

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011

Хорошо, я понял, в чем причина проблемы.

при запуске приложения метод appdidfinishlaunching не завершен до загрузки одного из контроллеров представления. Этот контроллер представления пытается получить доступ к одному из файлов, копируемых из пакета.

Я предполагаю, что sqlite создает файл при попытке доступа к базе данных, он создает его с нулевой длиной байта.

Поэтому, когда мой метод запуска appdidfinish проверяет наличие файла, он существует из-за вызова sql.

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

Теперь проблема в том, как мне заставить запуск appdidfinish завершиться до того, как остальным разрешат запуск, поскольку рассматриваемый контроллер представления является частью mainwindow.xib

0 голосов
/ 21 ноября 2011

Вы также проверили оригинальный размер файла?

Попробуйте сбросить настройки симулятора.Из документации NSFileManager:

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

Makeубедитесь, что пункт назначения пуст и попробуйте снова.Кроме того, проверьте объект error.

Если во всех этих проверках произошла ошибка в написании имени файла .Проверьте, существует ли точный файл в комплекте, NSLog везде, где вы используете имя файла или путь и т. Д. Вы должны найти ошибку.Также проверьте соответствующую папку в Finder.

Вместо использования

[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbname]

try

[[NSBundle mainBundle] pathForResource:shortName ofType:@"db"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...