Подтвердить что ты не робот

Ошибка переноса основных данных с помощью "Не удается найти модель для хранилища источников", но 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).

Я почти не понимаю, что делать дальше. Любые идеи, которые помогут отладить эту проблему, будут высоко оценены.

4b9b3361

Ответ 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];