Что случилось с моей копией здесь?

Я пытаюсь скопировать файл из моего пакета приложений в каталог документов приложения. Я получаю сообщение об ошибке "Cocoa Ошибка 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]);
}

Ответ 1

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

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

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

Ответ 2

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

NSFileReadUnsupportedSchemeError Read error because the specified URL scheme is unsupported

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

Ответ 3

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

    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, показанной выше.

Ответ 4

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

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