Копирование файла из пакета в документы не работает (ошибка Какао 512) - PullRequest
2 голосов
/ 30 октября 2011

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

Файл базы данных находится в моей папке Resources в 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%@\n\n", databasePathFromApp);
    NSLog(@"Path to copy to:\n%@\n\n", databasePath);

    [fileManager copyItemAtPath:databasePathFromApp
                     toPath:databasePath error:&error];
    [fileManager release];
    if (error)
    {
        NSLog(@"%@\n\n", 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] Ошибка домена = код NSCocoaErrorDomain = 512 «Операция не может быть завершена. (Ошибка 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-55D6545BB WaypointDatabase.sql, NSUnderlyingError = 0xe8b7ee0 "Операция не может быть завершена. Не каталог" "}

2011-10-30 10: 36: 13,272 хххх [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 \" Операция не может быть завершена \ U2019t. Не каталог \ ""; NSUserStringVariant = ( копия ); } * * Тысяча двадцать-один

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

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

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

[UPDATE]

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

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

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

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *err = nil;
NSArray *dirArr = [fileManager contentsOfDirectoryAtPath:documentsDir error:&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] ~~ Содержание:
(Нуль)
2011-10-30 10: 59: 16,936 xxxx [6774: 707] ~~ Ошибка:
Ошибка домена = NSCocoaErrorDomain Code = 256 "Операция не может быть завершена. (Ошибка 256. Какао)." UserInfo = 0x10052580 {NSUserStringVariant = ( скоросшиватель ), NSFilePath = / var / mobile / Applications / FF654016-4257-47BB-99FE-55DB5453BBC6 / Documents, NSUnderlyingError = 0x10054a50 "Операция не может быть завершена. Не каталог"}

Ответы [ 2 ]

2 голосов
/ 30 октября 2011

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

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

0 голосов
/ 30 октября 2011

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

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

на

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

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

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