Что не так с моей копией здесь? - PullRequest
10 голосов
/ 30 августа 2011

Я пытаюсь скопировать файл из пакета приложения в каталог документов приложения.Я получаю сообщение об ошибке «Ошибка какао 262».Что я делаю неправильно?Вот мой код:

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreData.sqlite"];
NSURL *initialURL = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"sqlite"]];

NSError *error = nil;

if (![[NSFileManager defaultManager] fileExistsAtPath:[initialURL absoluteString]]) {
    NSLog(@"Original does not exist. \nPath: %@", [initialURL absoluteString]);
}  

if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL absoluteString]]) {
    NSLog(@"Destination file does not exist. \nPath: %@", [storeURL absoluteString]);

    [[NSFileManager defaultManager] copyItemAtURL:initialURL toURL:storeURL error:&error];

    NSLog(@"Error: %@", [error description]);
}

Ответы [ 4 ]

32 голосов
/ 30 августа 2011

Проблема в том, что вы инициализируете URL простым старым путем к файлу.

NSURL *initialURL = 
    [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"CoreData" 
                                                         ofType:@"sqlite"]];

Используйте [NSURL fileURLWithPath:] вместо.

3 голосов
/ 30 августа 2011

Ошибка, которую вы получаете:

NSFileReadUnsupportedSchemeError Read error because the specified URL scheme is unsupported

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

2 голосов
/ 30 августа 2011

Я решил проблему, хотя, если честно, я не уверен, что это было. Я должен снова просмотреть рабочий код, но вот он:

    NSError *error = nil;


NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", @"CoreData", @"sqlite"]];

//if file does not exist in document directory, gets original from mainbundle and copies it to documents.

if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
    NSString *defaultFilePath = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"sqlite"];
    [[NSFileManager defaultManager] copyItemAtPath:defaultFilePath toPath:filePath error:&error];

    if (error != nil) {
        NSLog(@"Error: %@", error);
    }
}

Редактировать:

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

1 голос
/ 30 августа 2011

Ошибка 262 определена в FoundationErrors.h как NSFileReadUnsupportedSchemeError.

Я бы посоветовал вам использовать NSLog (), чтобы записать буквальные значения двух URL-адресов, которые вы используете, и убедиться, что они являются file: // URL-адресами и выглядят завершенными.

...