CoreData "Ошибка при проверке URL для магазина" - PullRequest
2 голосов
/ 30 сентября 2010

У меня проблема в приложении, CoreData работает должным образом в симуляторе, но не на устройстве.

Я получаю

2010-09-30 12:45:07.500 CoreDataTutorial_iOS[130:307] Unresolved error Error Domain=NSCocoaErrorDomain Code=513 "The operation couldn’t be completed. (Cocoa error 513.)" UserInfo=0x1412a0 {NSUnderlyingException=Error validating url for store}, {
    NSUnderlyingException = "Error validating url for store";

Я вызываю PersistentStoreCoordinator в этой функции (которая выдает ошибку выше):

-(NSPersistentStoreCoordinator*)persistentStoreCoordinator
{
    if(persistentStoreCoordinator_ != nil) 
        return persistentStoreCoordinator_;

    NSURL *aStoreURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingFormat:@"corebase.sqlite"]];
    NSError *anError = nil;

    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if(![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:aStoreURL options:nil error:&anError])
    {
        NSLog(@"Unresolved error %@, %@", anError, [anError userInfo]);
        abort();
    }

    return persistentStoreCoordinator;
}

Я устанавливаю точку останова на objc_exception_throw, чтобы увидеть, что такое aStoreURL, и это: Файл: //localhost/var/mobile/Applications/BE9A2982-BDC3-405D-A201-FB78E9E0790B/Documentscorebase.sqlite

Я заметил, что он сам не добавляет последний "/" после "/ Documents". Когда я создал URL таким образом

NSURL *aStoreURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingFormat:@"/corebase.sqlite"]];

Кажется, это сработало или, по крайней мере, прошло эту часть. Разве эта функция не должна сама добавлять эту часть?

-(NSString*) applicationDocumentsDirectory
{
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
}

Он отлично работает в симуляторе, что такое правильная практика?

1 Ответ

7 голосов
/ 03 октября 2010
NSURL *aStoreURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                  stringByAppendingFormat: @"corebase.sqlite"]];

должно быть

NSURL *aStoreURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
           stringByAppendingPathComponent: @"corebase.sqlite"]];

stringByAppending * PathComponent * вместо stringByAppending * Формат *. Эта хорошая маленькая ошибка была доставлена ​​вам автозаполнением: -)

Почему это работало в симуляторе? Я думаю, потому что вам разрешено создавать файлы везде на жестком диске. Таким образом, симулятор создал Documentscorebase.sqlite в вашем каталоге приложений. Вы должны проверить, если это там.

На iphone вы ограничены каталогом документов и не можете создавать файлы везде.

...