Ошибка переноса основных данных с помощью "Не удается найти модель для хранилища источников", но managedObjectModel для источника присутствует
У меня есть приложение cocoa с использованием данных ядра, которое теперь находится на 4-й версии модели управляемого объекта.
Моя управляемая объектная модель содержит абстрактные объекты, но до сих пор мне удалось получить работу с миграцией, создав соответствующие модели сопоставления и создав мое постоянное хранилище с помощью addPersistentStoreWithType: configuration: options: error, а NSMigratePersistentStoresAutomaticallyOption - YES.
NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
NSURL *url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: @"MyApp.xml"]];
NSError *error=nil;
[theCoordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:optionsDictionary error:&error]
Это отлично работает, когда я переношу из версии модели с 3 по 4, что связано с добавлением атрибутов нескольким объектам. Теперь, когда я пытаюсь добавить новую версию модели (версия 5), вызов addPersistentStoreWithType возвращает nil, и ошибка остается пустой. Переход от 4 до 5 включает добавление одного атрибута.
Я пытаюсь отладить проблему и проверил все следующие:
-
Исходная база данных на самом деле находится в версии 4, а управляемая объектная модель persistentStoreCoordinator находится в версии 5.
-
Модель сопоставления 4- > 5, а также модели управляемых объектов для версий 4 и 5 присутствуют в папке ресурсов моего встроенного приложения.
-
Я пробовал различные пути обновления модели. Странно я нахожу, что обновление с ранней версии 3 → 5 работает, но обновление с 4 → 5 завершается неудачно.
-
Я попытался добавить политику миграции пользовательских сущностей для переноса объекта, чьи атрибуты меняются... в этом случае я перепробовал метод beginEntityMapping: manager: error:. Интересно, что этот метод вызван, когда миграция работает (т.е. Когда я перехожу от 3 до 4 или от 3 до 5), но он не вызывается в случае неудачи (от 4 до 5).
Я почти не понимаю, что делать дальше. Любые идеи, которые помогут отладить эту проблему, будут высоко оценены.
Ответы
Ответ 1
Я отвечаю на свой вопрос здесь, если это помогает кому-то.
Важнейшей проблемой является то, что, когда я достиг версии 4 моей объектной модели, я также добавил в проект дополнительную модель управляемых объектов. Эта дополнительная модель была отделена от моей основной модели и просто используется для создания кэша в другом потоке и содержит данные, которые не связаны с основной моделью.
По-моему, я все еще инициализировал свой управляемый объектОбъект, используя
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]
который в моем случае создал модель, содержащую объекты из моей основной модели, а также мою другую модель. Эти нежелательные объекты имели свои хеш-версии в моей базе данных. Когда основные данные затем отправляются искать управляемую объектную модель, которая соответствует всем этим хэшам, она, естественно, не находит ее.
В моем случае решение состояло в том, чтобы вручную очистить мои файлы db до миграции (удаляя ошибки из-за нежелательных объектов).., а затем изменить мой код загрузки managedObjectModel на;
NSString *path = [[NSBundle mainBundle] pathForResource:@"MyDataModel" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];