Файлы модели Core Data не загружаются при переименовании

У меня есть файл модели, который называется "Модель". Если я переименую его в "SomeOtherName", он просто не загрузится.

initWithContentsOfURL возвращает nil и:

mergedModelFromBundles: [NSArray arrayWithObjects:[NSBundle mainBundle], nil]; 

... сбой, потому что он думает, что в этом массиве нет nil.

Мне позволено переименовать мою модель, так что не так? Я не могу дать вам больше информации, потому что у меня их нет: P Модель SomeOtherName помещается в комплект, и он должен загружаться просто отлично.

Спасибо

Ответ 1

Я столкнулся с одной и той же проблемой. Вот как я это решил:

Переименование одного файла модели недостаточно, поскольку он не переименовывает ссылку на текущую версию модели.

Оказывается, версия модели хранится в отдельном файле plist. Просто откройте его в текстовом редакторе и измените старое имя на новое имя файла модели.

Файл: YourNEWModelFile.xcdatamodeld/.xccurrentversion

<plist version="1.0">
  <dict>
     <key>_XCCurrentVersionName</key>
     <string>YourModelFile.xcdatamodel</string>  <-- Change this to YourNEWModelFile
  </dict>
</plist>

Обратите внимание, что вы должны выполнять это только при переименовании файла модели во время разработки. Для переноса модели данных в новую версию следуйте за документами Core Data.

Ответ 2

Наиболее вероятной причиной является то, что новое имя не включается в цель сборки. Проверьте цель для включенных файлов и убедитесь, что там есть новое имя. Если нет, добавьте его. Если старое имя файла удаляется, перед добавлением нового.

Если он находится в цель сборки, убедитесь, что новый файл сохраняет расширение .xcdatamodel. Проверьте встроенный комплект продуктов, чтобы подтвердить, что он содержит файл .mom или .momd с новым именем.

Ваш mergedModelFromBundles: должен выглядеть так:

NSManagedObjectModel *mom=[NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]];

... или:

NSManagedObjectModel *mom=[NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObjects:[NSBundle mainBundle],nil] ]; 

Ответ 3

Использование Xcode 7.2.1:

  • Перейдите в Навигатор проектов
  • Выберите файл модели данных (например, MyProject.xcdatamodeld)
  • Выберите этот файл File Inspector
  • Измените версию модели

Ответ 4

Недавно я столкнулся с этой проблемой, когда добавил новый атрибут к объекту модели данных.

Мне нужно было сделать следующее:

  • Скопируйте содержимое файлов Entity+CoreDataClass.h и Entity+CoreDataClass.m в текстовый редактор, чтобы сохранить пользовательские свойства, которые я создал для тех классов (например, вычисленные свойства)
  • Удалите 4 файла, которые XCode создал для меня: Entity+CoreDataClass.h, Entity+CoreDataClass.m, StockEntity+CoreDataProperties.h и StockEntity+CoreDataProperties.m
  • Добавить новые атрибуты в объект .xcdatamodelId
  • Выберите сущность из списка и выберите Editor -> Create NSManagedObject Subclass...
  • Добавьте вычисленные свойства, которые я скопировал на шаге 1, обратно в файлы Entity+CoreDataClass.h и Entity+CoreDataClass.m
  • Выберите фазу сборки для моей цели и удалите файл Entity+CoreDataClass.m из списка Compile Sources
  • Добавьте файл .xcdatamoelId в список Compile Sources.

Затем я смог успешно выполнить проект и выполнить его.

Ответ 5

Это сработало для меня:

  • Нажмите на свой номер YourName.xcdatamodel
  • Щелкните правой кнопкой мыши, чтобы отобразить инспектор файлов.
  • Справа вы можете увидеть "Целевое членство", должна быть отметка.

(Проверьте, совпадает ли имя в AppDelegate с файлом xcdatamodel.  - > let container = NSPersistentContainer (имя: "YourName" )......)

Ответ 6

Как выглядит код инициализации Core Data? Он должен выглядеть следующим образом:

NSManagedObjectModel *managedObjectModel = nil;
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"SomeOtherName" withExtension:@"mom"];

NSAssert(modelURL != nil);
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];