ошибка iPhone Core Data Lightweight Migration Cocoa 134130: не Может найти модель для исходного хранилища

Люди,

Легкая миграция приводит к сбою для меня 100% времени на этой строке:

[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]

с ошибкой:

Error: Error Domain=NSCocoaErrorDomain Code=134130 UserInfo=0x4fbff20 "Operation could not be completed. (Cocoa error 134130.)"
"Can't find model for source store";

Вот мой контекст управляемого объекта, модель и персистентное хранилище:

- (NSManagedObjectContext *) managedObjectContext {

    if (managedObjectContext != nil) {
        return managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }
    return managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }

    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Locations.sqlite"]];

    NSError *error;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

    // Allow inferred migration from the original version of the application.
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        NSLog(@"Error: %@",error);
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator;
}

У меня есть две версии моей модели в моем проекте: версия 4 и версия 5. Если я установил свою версию 4 по умолчанию, она хорошо работает. Если я выбираю "Дизайн->, Модель данных-> Добавляет Образцовую Версию" (как описано этим сообщением), вносит изменение, Дизайн-> Модель данных-> Текущая версия Набора, сборка и работает, это перестанет работать с вышеупомянутым, "Не может найти модель для исходной ошибки" хранилища. Задержите модель к версии 4, никаким проблемам, addPersistentStoreWithType. С другой стороны, если я добавляю образцовую версию и не вношу изменений, просто пойдите от версии 4 - 5, не добавляя новых полей, никаких проблем. Если я затем пытаюсь пойти от 5 до 6, вышеупомянутая ошибка.

Этот код перестал работать и на Средстве моделирования и на Телефоне. Я считал несколько призывов предписаний к удалению и переустановки приложения, которое действительно работает и на Средство моделирования и на Телефон, но я боюсь, что, когда я выпускаю это реальным пользователям, это повредит мою установленную базу, так как они не смогут удалить и переустановить - App Store автообновит их.

Этот код работал в выпусках мимо без изменений с моей стороны - следовательно моя способность сделать все это путем до версии 4. Я недавно обновил до XCode 3.2.3 здания для iOS4, который может иметь некоторое отношение к этому.

У кого-либо еще есть эта проблема внезапно теперь как, я? Кому-либо удалось работать мимо него?Спасибо.

PS - Для Сотрудников Google, которые спотыкаются на этой странице, вот все соответствующие страницы, Вы могли бы рассмотреть чтение, ниже. К сожалению, ни один из них не решил мою проблему.

ОБНОВЛЕНИЕ

В то время как это не реальная фиксация, она действительно избегает сценария отказывающего клиента: просто удалите файл базы данных:

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {



    // Delete file
    if ([[NSFileManager defaultManager] fileExistsAtPath:storeUrl.path]) {
        if (![[NSFileManager defaultManager] removeItemAtPath:storeUrl.path error:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) 
    {
        // Handle the error.
        NSLog(@"Error: %@",error);
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();

    }
}    

ОБНОВЛЕНИЕ 2

Вот то, что происходит, когда я осматриваю VersionInfo.plist:





        NSManagedObjectModel_CurrentVersionName
        Profile 5
        NSManagedObjectModel_VersionHashes
        
                Profile
                
                        Profile
                        
                        ZIICGgMBreuldkPXgXUhJwKamgwJzESM5FRTOUskomw=
                        
                
                Profile 2
                
                        Profile
                        
                        tEB7HrETWOSUuoeDonJKLXzsxixv8ALHOoASQDUIZMA=
                        
                
                Profile 3
                
                        Profile
                        
                        qyXOJyKkfQ8hdt9gcdFs7SxKmZ1JYrsXvKbtFQTTna8=
                        
                
                Profile 4
                
                        Profile
                        
                        lyWDJJ0kGcs/pUOModd3Q1ymDvdRiNXui4NCpLxDFSw=
                        
                
                Profile 5
                
                        Profile
                        
                        V4PyRK1ezj3xK1QFRCTVzGOqyJhEb7FRMzglrTsP0cI=
                        
                
        


Вот код, который я написал для осмотра моей модели (обратите внимание, что я должен был выйти и добавить base64 кодер, начиная с того, именно это находится в файле VersionInfo.plist),

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {


    NSDictionary *storeMeta = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:nil URL:storeUrl error:&error];
    NSLog(@"%@",storeMeta);
    id someObj = [[storeMeta objectForKey:@"NSStoreModelVersionHashes"] objectForKey:@"Profile"];
    NSLog(@"%@",someObj);
    NSLog(@"%@",[NSString base64StringFromData:someObj length:[someObj length]]);

И вот вывод отладки:

{
    NSPersistenceFrameworkVersion = 310;
    NSStoreModelVersionHashes =     {
        Profile = <97258324 9d2419cb 3fa5438c a1d77743 5ca60ef7 5188d5ee 8b8342a4 bc43152c>;
        SerializedMessage = <4530863c d943479a edfb4dfb 5059c28d d6137dc4 d1153d36 ed52be49 11074f13>;
    };
    NSStoreModelVersionHashesVersion = 3;
    NSStoreModelVersionIdentifiers =     (
    );
    NSStoreType = SQLite;
    NSStoreUUID = "823FD306-696F-4A0F-8311-2792825DC66E";
    "_NSAutoVacuumLevel" = 2;
}

<97258324 9d2419cb 3fa5438c a1d77743 5ca60ef7 5188d5ee 8b8342a4 bc43152c>
lyWDJJ0kGcs/pUOModd3Q1ymDvdRiNXui4NCpLxDFSw=

Как Вы видите, та последняя строка, которая запускается с Профиля соответствий 'ly' 4 в VersionInfo.plist... следовательно, я не вижу оснований, почему это должно перестать работать. Какие-либо другие идеи?

16
задан Community 23 May 2017 в 11:53
поделиться

1 ответ

Я прочитал ваш обновленный вопрос. С версиями моделей становится довольно запутанно.

Вы должны попытаться проверить версию модели, которую на самом деле запрашивает существующий магазин, и попытаться перечислить все доступные модели в пакете приложений во время выполнения.


Я смотрю в каталог моделей своих приложений

NSString *modelDirectoryPath = [[NSBundle mainBundle] pathForResource:@"MyModel" ofType:@"momd"];

Я не уверен, что разработчики обычно делают это, но я храню версии своих моделей с разными именами .. так что у меня там:

  • VersionInfo.plist
  • MyModel.mom
  • MyModel2.mom

Хэши версий, перечисленные в VersionInfo.plist , должны помочь вам в устранении неполадок. Найдите хэш версии, необходимый для существующего постоянного хранилища, и посмотрите, сможете ли вы найти его в хэшах версий, перечисленных в VersionInfo.plist .

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


Был еще один беглый взгляд, и он доступен в метаданных в магазине. Легко и приятно!

NSError *error;
NSURL *storeURL = [NSURL fileURLWithPath:[[self class] storePath]];
NSDictionary *storeMeta = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:nil URL:storeURL error:&error];

И заглянув в storeMeta , я получаю ключ с

<CFString 0x7328050 [0x2724380]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x7328340 [0x2724380]>{type = immutable dict, count = 5,
entries =>
    0 : <CFString 0x7328110 [0x2724380]>{contents = "MyEntityNameOne"} = <CFData 0x73281b0 [0x2724380]>{length = 32, capacity = 32, bytes = 0x143325cf121239ce156af2e2a1aad7d9 ... 976977fdf29fc013}
    1 : <CFString 0x7328130 [0x2724380]>{contents = "MyEntityNameTwo"} = <CFData 0x7328200 [0x2724380]>{length = 32, capacity = 32, bytes = 0x0ca6ecf1283d12bd3ca82af39b6b9f5d ... 149dd39a591e0c4d}
    ...    }

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

Вручную сопоставьте это с имеющимися в VersionInfo.plist и посмотрите, чего не хватает. Возможно, не существует единой модели, содержащей все необходимые версии сущностей в вашем существующем постоянном хранилище. Это могло произойти из-за (случайного?) Редактирования модели до или после установки новой версии модели?

4
ответ дан 30 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: