Переименовать файл xcdatamodel - PullRequest
19 голосов
/ 11 апреля 2011

Что нужно сделать, чтобы переименовать файл .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.

Ответы [ 9 ]

24 голосов
/ 12 марта 2012

Существует скрытый файл с именем .xccurrentversion, который должен находиться в том же месте, что и ваш файл .xcdatamodeld.Внутри есть ссылка на вашу модель, которую необходимо обновить с новым именем.

В некоторых случаях вам придется удалить файл .xcdatamodeld из проекта и добавить его снова, чтобы он работал.

22 голосов
/ 03 мая 2011

У меня была такая же проблема с Xcode 4. Не знаю, как ведет себя Xcode 3.

Во-первых, когда вы добавляете базовую модель данных в xcode, вы фактически получаете файл .xcdatamodeld, который представляет собой пакет, подобный файлу .xcodeproj. В Finder, вы можете щелкнуть по нему правой кнопкой мыши и «Показать содержимое пакета». Вы увидите, что он содержит файл .xcdatamodel.

Мне кажется, вы не можете переименовать его полностью, используя xcode. Xcode изменит имя файла пакета (momd), как вы видите его в пользовательском интерфейсе, но в файловой системе оно фактически не изменилось.

Ошибка nil модели, которую вы получаете, заключается в том, что она не может найти имя нового файла momd, так как оно все еще имеет старое имя на диске. (Наверное)

Я решил эту проблему, создав новую модель с нужным именем, затем в существующей модели вы можете перетащить и выбрать объекты, а затем просто вставить их в новый файл модели. Затем вы можете удалить старый файл и зафиксировать все изменения в вашем SCM.

7 голосов
/ 11 октября 2011

Спасибо всем вам за то, что помогли мне наконец приколоть это.Вот как я исправил это после переименования моего проекта в Xcode 4.2:

1) Удалите ссылку на файл * .xcdatamodeld в вашем проекте.Если он похож на мой, редактор не будет загружаться при его выборе.Это говорит о том, что при переименовании была нарушена ссылка.

2) Щелкните правой кнопкой мыши файл .xcdoeproj для своего проекта и выберите «Показать содержимое пакета».

3) Перетащите *.Файл xcdatamodeld, который вы найдете там, в вашем проекте.Готово.

Сборка моего приложения

3 голосов
/ 14 мая 2012

В XCode 4.3.2 он успешно переименовывает файл модели, но мне пришлось удалить его из проекта и снова добавить, чтобы он заработал.В противном случае это было бросание

1 голос
/ 13 ноября 2018

Обновление XCode 10 и Swift 4

С XCode 4.2 все может немного измениться В более поздних версиях это кажется проще, потому что мне просто нужно было:

  1. Измените OLD.xcdatamodeld на NEW.xcdatamodeld в левой вкладке fileInspector

  2. В AppDelegate просто измените имя ссылки: let container = NSPersistentContainer(name: "NEW")

1 голос
/ 11 апреля 2011

Похоже, что momd отсутствует в файлах ресурсов. Вы можете проверить в сгенерированном .app.

Убедитесь, что он находится в фазе сборки исходных текстов.

И очистка / восстановление иногда помогает с xcdatamodels ... Особенно при создании / переименовании их ...

0 голосов
/ 01 ноября 2017

В моем случае в моем проекте был файл 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.

0 голосов
/ 10 октября 2011

В Xcode 4.2 я переименовал файл моей модели (* .xcdatamodeld) в навигаторе проекта (он автоматически переименовал файл * .xcdatamodel внутри пакета и оба файла в моей файловой системе).

В initWithContentsOfURL: из NSManagedObjectModel я использовал новое имя.

Это привело к тому, что @ Mustafa описывает в вопросе (ноль модели).

Поэтому я попытался добавить новую версию моей модели , и это решило проблему (даже при том, что в моей модели не было изменений).

0 голосов
/ 12 апреля 2011

Вы не можете изменить имя любого файла в комплекте приложения после приложение создано. Как только пакет приложения исправлен, он не может быть изменен вообще.

Итак, если вы хотите изменить имя файла модели на устройстве, особенно на устройствах пользователя, вы не можете.

Однако, если вы все еще в разработке, просто измените имя файла в Xcode, щелкнув по имени файла и изменив его.

...