2013-12-01 5 views
0

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

1иХ создала новую версию модели для основных данных и установить его в текущую версию ...

2. Я добавил следующий код:

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

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Planner.sqlite"]; 

    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    NSDictionary *options = @{ 
           NSMigratePersistentStoresAutomaticallyOption : @YES, 
           NSInferMappingModelAutomaticallyOption : @YES 
           }; 
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 

     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return _persistentStoreCoordinator; 
} 

Однако, когда я запускаю обновление приложения на своем iPhone, он по-прежнему падает!

Изменения, которые я сделал, я добавил объект.

Вот журнал аварии:

Unresolved error Error Domain=NSCocoaErrorDomain Code=134130 "The operation couldn’t be completed. (Cocoa error 134130.)" UserInfo=0x14fb4530 {URL=file:///var/mobile/Applications/E8C39F0E-027E-4D5B-8D7B-74D592290D46/Documents/Planner.sqlite, metadata={ 
    NSPersistenceFrameworkVersion = 479; 
    NSStoreModelVersionHashes =  { 
     Audio = <f195c962 11c85401 0457370e e1b037e1 24c4e393 dc38ca34 cda3bb57 a3e26f2c>; 
     Classes = <3b64e147 eb41441b 73bf051f ce094443 2017845b 2faba1c7 47848618 9fd9713b>; 
     Homework = <4295bdbf 75862060 c7f1a501 3b0934cd 9811e838 bc40c5d5 05f8d383 f315d1f8>; 
     Notes = <b7be1214 70a89b62 924df103 397a801a 96080505 be87b0e2 408ebf24 fdddb1a7>; 
     Picture = <451cd1a2 9daac38d 69165176 0cacb6c8 94d1e93d eca34239 61a15f35 573f7e40>; 
     Tests = <c10b5b25 228ebceb 6099b9af c830d203 bfca8e2b c9f46ee8 c0cd648e 9ad3e742>; 
     Video = <b95e2033 b45b5aaf 298fef31 e6e25685 2b842e4e f2b3d9d1 82359c5f db9c78eb>; 
    }; 
    NSStoreModelVersionHashesVersion = 3; 
    NSStoreModelVersionIdentifiers =  (
     "" 
    ); 
    NSStoreType = SQLite; 
    NSStoreUUID = "4327E676-759B-4733-A7ED-12309BD482EE"; 
    "_NSAutoVacuumLevel" = 2; 
}, reason=Can't find model for source store}, { 
    URL = "file:///var/mobile/Applications/E8C39F0E-027E-4D5B-8D7B-74D592290D46/Documents/Planner.sqlite"; 
    metadata =  { 
     NSPersistenceFrameworkVersion = 479; 
     NSStoreModelVersionHashes =   { 
      Audio = <f195c962 11c85401 0457370e e1b037e1 24c4e393 dc38ca34 cda3bb57 a3e26f2c>; 
      Classes = <3b64e147 eb41441b 73bf051f ce094443 2017845b 2faba1c7 47848618 9fd9713b>; 
      Homework = <4295bdbf 75862060 c7f1a501 3b0934cd 9811e838 bc40c5d5 05f8d383 f315d1f8>; 
      Notes = <b7be1214 70a89b62 924df103 397a801a 96080505 be87b0e2 408ebf24 fdddb1a7>; 
      Picture = <451cd1a2 9daac38d 69165176 0cacb6c8 94d1e93d eca34239 61a15f35 573f7e40>; 
      Tests = <c10b5b25 228ebceb 6099b9af c830d203 bfca8e2b c9f46ee8 c0cd648e 9ad3e742>; 
      Video = <b95e2033 b45b5aaf 298fef31 e6e25685 2b842e4e f2b3d9d1 82359c5f db9c78eb>; 
     }; 
     NSStoreModelVersionHashesVersion = 3; 
     NSStoreModelVersionIdentifiers =   (
      "" 
     ); 
     NSStoreType = SQLite; 
     NSStoreUUID = "4327E676-759B-4733-A7ED-12309BD482EE"; 
     "_NSAutoVacuumLevel" = 2; 
    }; 
    reason = "Can't find model for source store"; 
} 

Я уже установить текущую версию модели.

Любая помощь будет оценена по достоинству.

Спасибо заранее,

Абдулла Shafique

Согласно @Scott я должен отменить все изменения моего источника и только изменить назначение

Может кто-то пожалуйста, объясните?

+0

Lightweight миграции может обрабатывать только определенные типы изменений. Какие изменения вы внесли в модель и какие ошибки вы получаете? –

+0

@ DuncanGroenewald Я добавил объект –

+0

Могла ли сообщение журнала аварий? –

ответ

1

Ошибка говорит:

"Не удается найти модель для исходного хранилища";

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

+0

Как я могу исправить это? –

+0

@AbdullahShafique: отменить все изменения в вашем источнике и изменить только пункт назначения (новая версия модели) –

+0

@Scott Можете ли вы объяснить, как это сделать? Я ценю вашу помощь. –

1

Когда вы добавляете новую версию модели Core Data, XCode создает другую модель, и вам будет предложено предоставить имя модели для новой версии. Итак, теперь вы должны иметь две модели в проекте XCode. После того, как вы создали новую версию, вам необходимо выбрать ее и установить ее как текущую версию, которая будет использоваться приложением. Вы сохраняете старую версию модели в проекте.

Для того, чтобы Core Data открывал существующие файлы, ему нужна старая версия модели (модель для хранилища источников). Затем он выполнит миграцию, перемещая данные в новую схему (или модель).

Таким образом, приведенная выше ошибка указывает на непреднамеренное внесение изменений в исходную версию модели (возможно, в дополнение к изменениям в новой версии). Однако Core Data не может открыть файл без правильной версии модели, поэтому вам необходимо восстановить копию исходной модели данных ядра. Если бы все, что вы делали, это добавить новую сущность в новую модель, то проверьте, не был ли случайно добавлен этот новый объект в старую модель, и если это просто удалить его из старой версии модели.

+0

Как восстановить старую модель? –

+0

У вас есть копия старой модели? –

+0

Да У меня есть копия –

2

Попробуйте использовать этот код для проверки версии модели и вывода метаданных

/*! The method checks the Core Data file version is compatible with the App's model version 
    and then pushes the main menu view onto the navigation stack. If not compatible it displays a 
    message to the user. 

    @param file The file URL for the Core Data Store. With UIManagedDocument you have to get the 
       actual store file URL, you can't just use the UIManagedDocument file URL. 
*/ 
-(voidcheckCoreDataFileVersion:(NSURL*)file 
{ 
    if ([self checkVersion:file]) { 

     // file version is compatible so continue (add code to push the menu view) 


    } else { 

     // file version is NOT compatible 

     _fileOpenErrorAlert = [[UIAlertView alloc] initWithTitle:@"Unable to open Document" message:@"Please check that you have the correct application version installed" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [_fileOpenErrorAlert show]; 

    } 
    return; 
} 
/*! Checks the Core Data files models version against the apps model version to see if they 
    are compatible. This will return YES if a lightweight migration can be performed and NO if NOT. 

    @param fileURL The file URL for the Core Data Store. With UIManagedDocument you have to get the 
       actual store file URL, you can't just use the UIManagedDocument file URL. 
    @return Returns YES if they are compatible and NO if not. 
*/ 
- (bool)checkVersion:(NSURL*)fileURL { 

    NSManagedObjectModel *model = [self managedObjectModel]; 

    NSLog(@" app model entity version hashes are %@", [model entityVersionHashesByName]); 

    NSError *error; 
    NSDictionary *metaData = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:fileURL error:&error]; 

    if (!metaData) { 
     NSLog(@“ problem getting metaData"); 
     NSLog(@“ - error is %@, %@", error, error.userInfo); 
     return NO; 
    } 

    bool result = [model isConfiguration:nil compatibleWithStoreMetadata:metaData]; 
    if (!result) { 
     NSLog(@“ file is not compatible!"); 
     NSLog(@“ metadata is %@", metaData); 
    } 

    return result; 

} 
+0

Do I поместите эти строки кода в свой AppDelegate –

+0

Ну, вам нужно будет вызвать 'checkCoreDataFileVersion:' где-то перед созданием persistentStoreCoordinator, поэтому просто вызовите его сразу после того, как вы установите значение для 'storeURL' и перейдете в' storeURL'. –

+0

Oops - произошла ошибка в последних нескольких строках, где записывался вывод LOG, не проверяя коды результатов. Я просто обновил это, чтобы включить строку 'if (! result). –

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