Файлы модели 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];