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

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

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

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

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

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

Спасибо

Ответы [ 6 ]

26 голосов
/ 18 февраля 2012

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

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

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

Файл: YourNEWModelFile.xcdatamodeld/.xccurrentversion

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

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

2 голосов
/ 13 августа 2011

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

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

Ваша объединенная модель из пакетов: должна выглядеть следующим образом:

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

... или:

NSManagedObjectModel *mom=[NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObjects:[NSBundle mainBundle],nil] ]; 
1 голос
/ 20 сентября 2017

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

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

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

1 голос
/ 04 марта 2017

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

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

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

После этого я смог успешно построить и запустить проект.

1 голос
/ 07 марта 2016

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

  1. Перейти к навигатору проекта
  2. Выберите файл модели данных (например, MyProject.xcdatamodeld)
  3. Выберите инспектор файлов этого файла
  4. Изменение версии модели
0 голосов
/ 12 августа 2011

Как выглядит ваш код инициализации Core Data?Это должно выглядеть так:

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

NSAssert(modelURL != nil);
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...