Копирование файла из пакета в документы не работает (ошибка Cocoa 512)

#iphone #ios #cocoa-touch

#iPhone #iOS #прикосновение какао

Вопрос:

Я пытаюсь просто скопировать свою базу данных sqlite3 в каталог documents. Я получаю Cocoa Error 512 , и я понял, что это недопустимый каталог (или что-то в этом роде.

Файл базы данных находится в папке «Мои ресурсы» в XCode. (Имя файла указано правильно)

Вот код, который я пытаюсь использовать:

 -(void) checkAndCreateDatabase
{
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];

    //databasePath   databaseName is declared in the header
    databaseName = @"WaypointDatabase.sql";
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

    success = [fileManager fileExistsAtPath:databasePath];
if(success)
    {
        NSLog(@"Database exists");
            return;
    }
    else
        NSLog(@"Database does not exists");

    NSString *databasePathFromApp = [[NSBundle mainBundle] pathForResource:@"WaypointDatabase" ofType:@"sql"];
    if(databasePathFromApp == nil)
    {
        NSLog(@"ERROR: IT IS NIL");
    }
    NSError* error = nil;

    NSLog(@"Path in bundle:n%@nn", databasePathFromApp);
    NSLog(@"Path to copy to:n%@nn", databasePath);

    [fileManager copyItemAtPath:databasePathFromApp
                     toPath:databasePath error:amp;error];
    [fileManager release];
    if (error)
    {
        NSLog(@"%@nn", error);
        NSLog(@"%@", [error userInfo]);
    }
}
 

И вывод на консоль, который я получаю,:

2011-10-30 10:36:13.242 xxxx[6726:707] База данных не существует
2011-10-30 10:36:13.249 xxxx[6726:707] Путь в пакете:
/var/mobile/Applications/FF654016-4257-47BB-99FE-55DB5453BBC6/xxxx.app/WaypointDatabase.sql

2011-10-30 10:36:13.252 xxxx[6726:707] Путь для копирования:
/var/mobile/Applications/FF654016-4257-47BB-99FE-55DB5453BBC6/Documents/WaypointDatabase.sql

2011-10-30 10:36:13.268 xxxx[6726:707] Ошибка Domain= NSCocoaErrorDomain Code= 512 «Не удалось завершить операцию. (Ошибка Cocoa 512.)» userInfo=0xe8b7cd0 {NSUserStringVariant=(Копировать), NSFilePath=/var/mobile/Applications/FF654016-4257-47BB-99FE-55DB5453BBC6/xxxx.app/WaypointDatabase.sql , NSDestinationFilePath=/var/mobile/Applications/FF654016-4257-47BB-99FE-55DB5453BBC6/Documents/WaypointDatabase.sql, NSUnderlyingError=0xe8b7ee0 «Не удалось завершить операцию. Не каталог «}

2011-10-30 10:36:13.272 xxxx[6726:707] { NSDestinationFilePath = «/var/mobile/Applications/FF654016-4257-47BB-99FE-55DB5453BBC6/Documents/WaypointDatabase.sql»; NSFilePath = «/var/mobile/Applications/FF654016-4257-47BB-99FE-55DB5453BBC6/xxxx.app/WaypointDatabase.sql»; NSUnderlyingError = «Ошибка домена = NSPOSIXErrorDomain Code = 20″Операция не может быть завершена. Не каталог «»; NSUserStringVariant = ( Копировать ); }

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

Обратите внимание, это работает отлично и без каких-либо ошибок на симуляторе.

Где я мог ошибиться?

[ОБНОВЛЕНИЕ]

Может быть, это связано Documents с тем, что каталог -folder не существует? Как бы мне приступить к его созданию / проверке?

[ОБНОВЛЕНИЕ 2]

Я провел несколько других тестов, используя

 NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *err = nil;
NSArray *dirArr = [fileManager contentsOfDirectoryAtPath:documentsDir error:amp;err];
NSLog(@"~~Contents:n%@",dirArr);
NSLog(@"~~Error: n%@",err);
 

И, что удивительно, он дал Cocoa Error 256 , а также сказал «Не каталог». Это почти так же, как если Documents directory does not exist. But it does, according to бы NSSearchPathForDirectoriesInDomains`

Вот результат, который я получил

2011-10-30 10:59:16.934 xxxx[6774:707] ~~ Содержимое:
(null)
2011-10-30 10:59:16.936 xxxx[6774:707] ~~ Ошибка:
Ошибка домена = NSCocoaErrorDomain Code= 256 «Операция не может быть завершена. (Ошибка Cocoa 256.)» userInfo=0x10052580 {NSUserStringVariant=( Папка ), NSFilePath=/var/mobile/Applications/FF654016-4257-47BB-99FE-55DB5453BBC6/Documents, NSUnderlyingError= 0x10054a50 «Не удалось завершить операцию. Не каталог «}

Комментарии:

1. вы не должны выпускать FileManager, он автоматически выпускается

2. @phix23, опубликуйте это в документации, так что я думаю, что было бы лучше сделать это.

3. Вы не должны выпускать его, потому что вы его не выделили. Что такое DatabasePath? Разве не должно быть так, что вы создаете из documentsDir и DatabaseName несколько строк сверх этого?

4. @Nideo это ужасная причина для того, чтобы что-то делать. Придерживайтесь правил управления памятью, если вы не вызываете alloc new ее или copy она вам не принадлежит, поэтому не освобождайте ее

5. @Paul.s — я только что с Явы…

Ответ №1:

Проблема была решена путем установки нестандартного идентификатора пакета в die info.plist

Я использовал идентификатор пакета из iTunes Connect для этого конкретного приложения. Теперь все работает отлично.

Ответ №2:

Попробуйте измениться

 [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
 

для

 [[NSBundle mainBundle] pathForResource:@"WaypointDatabase" ofType:@"sql"];
 

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

Комментарии:

1. Я попробовал это, а также поставил a if , чтобы проверить, есть ли результат этого nil — чего не было. Обычная ошибка все еще возникает.