重命名 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_.xcdatamodelonly 模型(没有 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 文件,以及我的文件系统中的两个文件)。

NSManagedObjectModelinitWithContentsOfURL: 中,我使用了一个新名称。

这导致 @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 文件的主要内容,如果未能解决你的问题,请参考以下文章

js 如何批量重命名文件

为啥linux无法重命名文件

关于C#实现文件重命名

apt无法重命名文件

关于 java 重命名文件夹的问题?

如何让文件自动重命名?