2010-09-30 2 views
2

У меня возникла проблема в моем приложении, CoreData работает так, как и должно быть в симуляторе, но не на устройстве.CoreData «Ошибка проверки URL-адреса для магазина»

я получаю

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]; 
} 

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

ответ

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

должен быть

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

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

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

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

Смежные вопросы