2012-06-10 3 views
1

Я получаю эту ошибку: Операция не может быть завершена. (Ошибка Cocoa 134140.) * Завершение приложения из-за неотображенного исключения «NSInvalidArgumentException», причина: «Указанное постоянное хранилище не было найдено».'Указанный постоянный магазин не найден.' ошибка в CoreData

Я просто перешел на новую версию своей модели данных. Однако, если я активирую предыдущую версию модели данных, приложение прекрасно работает. Если я активирую новую версию, я получаю эту ошибку. Единственное изменение, которое я сделал, это то, что я сделал все переменные, не являющиеся необязательными, в моей модели данных, которые должны быть обработаны функцией автоматической миграции. Я не понимаю, почему он говорит, что не может найти постоянное хранилище, когда нет ошибки, вызванной [fileManager copyItemAtPath: defaultStorePath toPath: ошибка myPathDocs: & ошибка].

Я, кажется, думаю, что это связано с тем, что файл sqlite в моем основном пакете из старой версии модели данных, но там нет файла sqlite, который исходит из новой версии. Однако у меня создалось впечатление, что автоматическая миграция просто создаст новый файл для новой модели самостоятельно (?) И перенесет данные из существующего файла в нее. Это неправильно?

В моем приложении iOS у меня есть файл Formats.sqlite, который находится в моих ресурсах. При запуске после чистой установки приложение увидит, существует ли существующий файл Formats.sqlite в папке приложения/Документы. Если этого нет, он копирует один из его основного пакета. Все это отлично работало, прежде чем я сделал новую версию своей модели. Вот код, я использую для этого:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    int count = [[persistentStoreCoordinator persistentStores] count]; 
    if (persistentStoreCoordinator != nil && count) { 
     return persistentStoreCoordinator; 
    } 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:@"Formats.sqlite"]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error = nil; 
    if (![fileManager fileExistsAtPath:myPathDocs]) { 
     NSLog(@"SQLite file not found, copying SQLITE file"); 
     NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Formats" ofType:@"sqlite"]; 
     if (defaultStorePath) { 
      if(![fileManager copyItemAtPath:defaultStorePath toPath:myPathDocs error:&error]) { 
       NSLog(@"Error copying file at defaultStorePath to the documents path: %@",error); 
      } 
     } 
    } 
    storeURL = [NSURL fileURLWithPath:myPathDocs]; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
          nil]; 
    if (persistentStoreCoordinator == nil) { 
     persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    } 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
    {//my error code here} 

Итак ошибка выкинут, где он говорит «мой код ошибки здесь.» Что мне делать, чтобы исправить это? Почему это происходит? Кстати, консоль выплевывает все шаги для миграции, поэтому похоже, что она пытается это сделать, но тогда она не может найти постоянный магазин, который я не понимаю, почему он не может его найти, поскольку он был добавлен в цели сборки.

Я просто хочу убедиться, что если люди будут обновляться с предыдущих версий приложения, их данные будут перенесены, и им не придется повторно вводить все. Благодаря!

ответ

0

Чтобы найти источник ошибки, я использовал этот код, чтобы получить наиболее подробное описание ошибки из отладчика:

NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; 
    if(detailedErrors != nil && [detailedErrors count] > 0) { 
     for(NSError* detailedError in detailedErrors) { 
      NSLog(@" DetailedError: %@", [detailedError userInfo]); 
     } 
    } else { 
     NSLog(@" %@", [error userInfo]); 
    } 

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

Вышеприведенный фрагмент кода очень полезен для отладки ошибок Core Data, поскольку без него Core Data не обязательно скажет вам, какое точное свойство в вашей модели является источником проблемы. Использование кода «DetailedError» дало мне точную информацию, в которой я нуждался. Спасибо, "detailError."

+2

Спасибо. У меня была эта проблема, и я прочитал это. Это спасло меня. Тогда я понял, что я это написал. Гм. – CommaToast

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