Переименовать файл xcdatamodel
что нужно сделать, чтобы переименовать .файл xcdatamodel. Переименование. xcdatamodel имя файла, наряду с изменением ...
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"newfilename" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
и
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"newfilename.sqlite"];
не работает! Я получаю следующую ошибку:
2011-04-11 17:19:54.164 ProjectName[5826:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
*** Call stack at first throw:
(
0 CoreFoundation 0x00fa15a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x010f5313 objc_exception_throw + 44
2 CoreData 0x00013853 -[NSPersistentStoreCoordinator initWithManagedObjectModel:] + 419
3 ProjectName 0x00003471 -[ProjectNameAppDelegate persistentStoreCoordinator] + 257
4 ProjectName 0x000031a4 -[ProjectNameAppDelegate managedObjectContext] + 100
5 ProjectName 0x000028ca -[ProjectNameAppDelegate makeSplitViewController] + 762
6 ProjectName 0x00002d44 -[ProjectNameAppDelegate application:didFinishLaunchingWithOptions:] + 68
7 UIKit 0x001f3c89 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163
8 UIKit 0x001f5d88 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 439
9 UIKit 0x00200617 -[UIApplication handleEvent:withNewEvent:] + 1533
10 UIKit 0x001f8abf -[UIApplication sendEvent:] + 71
11 UIKit 0x001fdf2e _UIApplicationHandleEvent + 7576
12 GraphicsServices 0x018f9992 PurpleEventCallback + 1550
13 CoreFoundation 0x00f82944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
14 CoreFoundation 0x00ee2cf7 __CFRunLoopDoSource1 + 215
15 CoreFoundation 0x00edff83 __CFRunLoopRun + 979
16 CoreFoundation 0x00edf840 CFRunLoopRunSpecific + 208
17 CoreFoundation 0x00edf761 CFRunLoopRunInMode + 97
18 UIKit 0x001f57d2 -[UIApplication _run] + 623
19 UIKit 0x00201c93 UIApplicationMain + 1160
20 ProjectName 0x00002599 main + 121
21 ProjectName 0x00002515 start + 53
)
terminate called after throwing an instance of 'NSException'
Примечание: я использую Xcode4.
8 ответов
У меня была такая же проблема с Xcode 4. Не знаю, что такое поведение в Xcode 3.
во-первых, когда вы добавляете модель основных данных в xcode, вы фактически получаете .xcdatamodeld файл, который является пакетом, как .xcodeproj файл. В finder вы можете щелкнуть правой кнопкой мыши и "показать содержимое пакета". Вы увидите, что он содержит a .файл xcdatamodel.
Мне кажется, вы не можете переименовать его полностью с помощью xcode. Xcode изменит имя файла пакета (momd), как вы см. его в пользовательском интерфейсе, но в файловой системе он фактически не изменился.
ошибка модели nil, которую вы получаете, потому что она не может найти newfilename momd, так как у нее все еще есть старое имя на диске. (Я думаю)
Я обошел это, создав новую модель с именем, которое я хотел, затем в существующей модели вы можете нажать-перетащить и выбрать свои объекты, а затем просто вставить их в файл новой модели. Затем вы можете удалить старый и зафиксировать все изменения в SCM.
существует скрытый файл с именем .xccurrentversion, который должен находиться в том же месте, что и ваш.xcdatamodeld файл. Внутри есть ссылка на модель, которая должна быть обновлена с новым именем.
в некоторых случаях вам придется удалить .xcdatamodeld файл из проекта и добавить его снова, чтобы заставить его работать.
спасибо всем вам за то, что помогли мне, наконец, прибить это. Вот как я исправил это после переименования моего проекта в Xcode 4.2:
1) удалить ссылку на *.xcdatamodeld файл в ваш проект. Если он похож на мой, редактор не будет загружаться при его выборе. Это говорит мне, что ссылка была нарушена в переименовании.
2) щелкните правой кнопкой мыши на .xcdoeproj файл для вашего проекта и выберите "Показать содержимое пакета".
3) перетащить *.xcdatamodeld файл найдите там обратно в свой проект. Сделанный.
мое приложение buil
в XCode 4.3.2 он успешно переименовывает файл модели, но мне пришлось удалить его из проекта и добавить его снова, чтобы он работал. В противном случае это был бросок
похоже, что momd отсутствует в файлах ресурсов. Вы можете проверить сгенерированный .приложение.
убедитесь, что он находится на этапе сборки источников компиляции.
и clean / rebuild иногда помогает с xcdatamodels... Особенно при их создании / переименовании...
вы не можете изменить имя любого файла в пакете приложений после приложение. После того, как пакет приложений исправлен, он не может быть изменен вообще.
Итак, если вы хотите изменить имя файла модели на устройстве, особенно на устройствах пользователя, ну, вы не можете.
однако, если вы все еще находятся в разработке, просто измените имя файла в Xcode, нажав на имя файла и изменять его.
в Xcode 4.2 я переименовал свою модель (*.xcdatamodeld) файл в навигаторе проектов (он автоматически переименован *.xcdatamodel файл внутри пакета, и оба файла в моей файловой системе).
на initWithContentsOfURL:
на NSManagedObjectModel
, я использовал новое имя.
это привело к тому, что @Mustafa описывает в вопросе (нулевая модель).
поэтому я попытался добавление новой версии моей модели и это решило проблему (хотя у меня не было никаких изменений в моем модель.)
в моем случае у меня был файл под названием Model.xcdatamodeld
в моем проекте я решил переименовать его в MyModel.xcdatamodeld
через XCode. Это было правильно, однако внутренний файл по-прежнему назывался Model.xcdatamodel
. Я не мог переименовать его через XCode, поэтому я сделал через моего друга Finder. Проблема с этого момента заключалась в том, что Xcode больше не открывал этот файл. Тогда то, что я сделал, просто искал его на project.pbxproj
и переименовал имя файла. Теперь Xcode может открыть его отлично.
1D707FAE1FA9EBAB00A6D123 /* Model.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MyModel.xcdatamodel; sourceTree = "<group>"; };
конечно, что я также пришлось переименовать его в AppDelegate.