重命名 xcdatamodel 文件
Posted
技术标签:
【中文标题】重命名 xcdatamodel 文件【英文标题】:Rename xcdatamodel file 【发布时间】:2011-04-11 12:22:03 【问题描述】:重命名 .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。
【问题讨论】:
我想更多细节会带来答案,比如异常消息/跟踪。 已添加到问题中。谢谢。 【参考方案1】:有一个名为 .xccurrentversion 的隐藏文件,它应该与whatever.xcdatamodeld 文件位于同一位置。里面有一个对您的模型的引用,需要使用新名称进行更新。
在某些情况下,您必须从项目中删除 .xcdatamodeld 文件并重新添加以使其正常工作。
【讨论】:
+1 以全面了解问题。重命名了一个 .xcdatamodeld 文件,出现了这个问题。为什么 Xcode 不能自动改变这个?? 对我起作用了.. 提到的文件是一个隐藏文件。以下是在 MAC OS X Lion 中显示隐藏文件的步骤joshklein.net/how-to-show-hidden-files-in-mac-os-x-lion 太棒了!自从尝试(小心地)重命名项目后,我的应用程序不断崩溃……删除和重新添加 .xcdatamodelId 文件解决了这个问题。谢谢! 哇,这太可怕了。确实似乎让 Xcode 使用.xcdatamodeld
结构更改布局/命名的唯一方法是自己在磁盘上完成,然后重新添加到 Xcode
整整 10 年后仍然相关!【参考方案2】:
我在使用 Xcode 4 时遇到了同样的问题。不知道 Xcode 3 中的行为是什么。
首先,当您在 xcode 中添加核心数据模型时,您实际上会得到一个 .xcdatamodeld 文件,它是一个类似于 .xcodeproj 文件的包。在查找器中,您可以右键单击它并“显示包内容”。 您会看到它包含一个 .xcdatamodel 文件。
在我看来,您无法使用 xcode 完全重命名它。 Xcode 将更改您在 UI 中看到的包文件(momd)的名称,但在文件系统上它实际上并没有更改。
您得到的 nil 模型错误是因为它找不到新文件名 momd,因为它在磁盘上仍有旧名称。 (我猜)
我通过创建一个具有我想要的名称的新模型来解决这个问题,然后在现有模型中,您可以单击并选择您的实体,然后将它们粘贴到新模型文件中。然后,您可以删除旧的并将所有更改提交到您的 SCM。
【讨论】:
这为我修复了 - 重新创建和删除。 Xcode 12 的有趣问题...由于 UI 更改,我没有单击并拖动我的实体,而是将它们复制并粘贴到新模型文件中。在新文件中,我的许多反向关系、删除规则和所有代码生成设置都丢失了。一旦我解决了这些问题,一切都很好。【参考方案3】:感谢大家帮助我最终确定了这一点。以下是我在 Xcode 4.2 中重命名项目后解决此问题的方法:
1) 删除项目中对 *.xcdatamodeld 文件的引用。如果它和我的一样,选择它时不会加载编辑器。这告诉我重命名时链接已损坏。
2) 右键单击项目的 .xcdoeproj 文件并选择“显示包内容”。
3) 将您在此处找到的 *.xcdatamodeld 文件拖回您的项目中。完成。
我的应用程序构建
【讨论】:
【参考方案4】:在 XCode 4.3.2 中,它成功地重命名了模型文件,但我必须将其从项目中删除并再次添加以使其工作。否则它正在抛出
【讨论】:
在 finder 中复制文件,然后在 xcode 中删除以及删除文件,而不仅仅是引用对我有用,重新添加对我有用【参考方案5】:资源文件中似乎缺少 momd。您可以签入生成的.app。
确保它处于编译源构建阶段。
清理/重建有时对 xcdatamodel 有帮助...尤其是在创建/重命名它们时...
【讨论】:
就是这样。 momd 文件未重命名。我该如何解决这个问题? 通过删除所有构建/内容尝试“硬清理”。检查构建日志的详细信息以查看生成的内容(以及原因)。还要注意版本化模型.xcdatamodel_d_
与 .xcdatamodel
only 模型(没有 d)将以资源结尾。【参考方案6】:
XCode 10 更新和 Swift 4
自 XCode 4.2 以来,情况可能发生了一些变化 在以后的版本中似乎更简单,因为我只需要:
在 fileInspector 左侧选项卡中将 OLD.xcdatamodeld
更改为 NEW.xcdatamodeld
在 AppDelegate
中更改参考名称:let container = NSPersistentContainer(name: "NEW")
【讨论】:
不,他们没有,我使用的是 Xcode 11.4,问题仍然存在。重命名xcdatamodeld
不会重命名其中的xcdatamodel
文件。【参考方案7】:
在构建应用之后,您无法更改应用包中任何文件的名称。应用程序包一旦修复,就根本无法更改。
因此,如果您想更改设备上模型文件的名称,尤其是在用户设备上,那么您不能。
但是,如果您仍在开发中,只需在 Xcode 中通过单击文件名并进行更改来更改文件名。
【讨论】:
【参考方案8】:在 Xcode 4.2 中,我在项目导航器中重命名了我的模型 (*.xcdatamodeld) 文件(它自动重命名了包内的 *.xcdatamodel 文件,以及我的文件系统中的两个文件)。
在NSManagedObjectModel
的initWithContentsOfURL:
中,我使用了一个新名称。
这导致 @Mustafa 在问题中描述的内容(无模型)。
所以我尝试添加我的模型的新版本,它解决了问题(即使我的模型没有更改)。
【讨论】:
【参考方案9】:就我而言,我的项目中有一个名为 Model.xcdatamodeld
的文件,我决定通过 XCode 将其重命名为 MyModel.xcdatamodeld
。它确实正确,但内部文件仍称为Model.xcdatamodel
。我无法通过 XCode 重命名它,所以我通过我的朋友 Finder 重命名。从现在开始的问题是 Xcode 不再打开这个文件了。然后我所做的只是在project.pbxproj
上搜索它并重命名文件名。现在Xcode可以完美打开了。
1D707FAE1FA9EBAB00A6D123 /* Model.xcdatamodel */ = isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MyModel.xcdatamodel; sourceTree = "<group>"; ;
当然,我还必须在 AppDelegate 上重命名它。
【讨论】:
【参考方案10】:这可以通过以下方式完成:在 XCode 中打开 .xcdatamodeld
。在检查器面板中,转到“身份和类型”部分。在Full Path
字段中,单击完整路径旁边的箭头图标。在 Finder 中复制您希望重命名的 xcdatamodel。将副本重命名为所需的名称。返回 Xcode,单击 Location
字段旁边的目录图标。选择您重命名为所需名称的 xcdatamodel 副本,然后单击 Choose
。如果您愿意,可以删除旧的原始 xcdatamodel。
【讨论】:
以上是关于重命名 xcdatamodel 文件的主要内容,如果未能解决你的问题,请参考以下文章