insertNewObjectForEntityForName 找不到实体 (Swift)

Posted

技术标签:

【中文标题】insertNewObjectForEntityForName 找不到实体 (Swift)【英文标题】:insertNewObjectForEntityForName could not locate entity (Swift) 【发布时间】:2014-06-11 10:29:28 【问题描述】:

我正在尝试将工作中的 CoreData 应用程序移植到 Swift。此代码失败:

    let moc = self.context
    NSLog("Entities: \(moc.persistentStoreCoordinator.managedObjectModel.entitiesByName.allKeys)")
    let obj = NSEntityDescription.insertNewObjectForEntityForName("School",
        inManagedObjectContext:moc)

NSLog 的输出是这样的:

2014-06-11 11:23:51.634 WYBData[18480:303] Entities [Address, Contact, Hospital, Person, Place, School]

因此,即使日志显示有一个名为 School 的实体,我认为这意味着 NSManagedObjectContext 已正确设置,但我仍然收到此错误:

2014-06-11 11:23:55.338 WYBData[18480:303] +entityForName: could not locate an entity named 'School' in this model.
2014-06-11 11:23:55.340 WYBData[18480:303] (
0   CoreFoundation                      0x00007fff8c05725c __exceptionPreprocess + 172
1   libobjc.A.dylib                     0x00007fff8f274e75 objc_exception_throw + 43
2   CoreData                            0x00007fff89b20a19 +[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:] + 201
3   WYBData                             0x00000001000171f3 _TFC7WYBData12WYBXmlParser7executefS0_FRGSqCSo7NSError_Sb + 2403
4   WYBData                             0x000000010000ea4a _TFC7WYBData11WYBMainView2gofS0_FPSs9AnyObject_T_ + 1642
5   WYBData                             0x000000010000ead2 _TToFC7WYBData11WYBMainView2gofS0_FPSs9AnyObject_T_ + 66
6   AppKit                              0x00007fff91d97260 -[NSApplication sendAction:to:from:] + 327
7   AppKit                              0x00007fff91d970de -[NSControl sendAction:to:] + 86
8   AppKit                              0x00007fff91de3c4d -[NSCell _sendActionFrom:] + 128
9   AppKit                              0x00007fff91dfd655 -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2316
10  AppKit                              0x00007fff91dfca27 -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 487
11  AppKit                              0x00007fff91dfc13d -[NSControl mouseDown:] + 706
12  AppKit                              0x00007fff91d7da58 -[NSWindow sendEvent:] + 11296
13  AppKit                              0x00007fff91d1c5d4 -[NSApplication sendEvent:] + 2021
14  AppKit                              0x00007fff91b6ca19 -[NSApplication run] + 646
15  AppKit                              0x00007fff91b577a3 NSApplicationMain + 940
16  WYBData                             0x000000010000a9ed top_level_code + 109
17  WYBData                             0x000000010000aa2a main + 42
18  libdyld.dylib                       0x00007fff8bf085fd start + 1
19  ???                                 0x0000000000000003 0x0 + 3
)

我可以正确地创建一个Address 实体,但不能正确创建其他实体。即使这很奇怪,因为AddressContact 的子实体,但尝试创建Contact 会导致上述相同的错误。

我错过了什么?

编辑:

我暂时从我的核心数据模型中删除了Address,现在可以创建Contact,但没有别的了。所以似乎我只能创建模型中定义的第一个实体(按字母顺序)。这听起来像是一个错误,还是我的NSManagedObjectModel 会以某种方式损坏?

【问题讨论】:

当你使用 println() 代替 NSLog() 会发生什么? 感谢@Areal-17,我得到了与 NSLog() 完全相同的输出 【参考方案1】:

对于遇到同样问题的其他人:问题是我的.xcdatamodeld 文件。它一定是以某种方式损坏了,因为我创建了一个新文件并准确地重新创建了我的数据模型,现在它可以工作了。我看不出这两个文件之间有任何区别(至少在 Xcode Core Data 模型编辑器中)。

我的数据模型在 ios 和 OS-X 项目之间共享(OS-X 应用程序为 iOS 应用程序准备数据)。我想知道为 iOS 创建的 .xcdatamodeld 文件与 OS-X 相比是否有任何不同。

【讨论】:

我也有同样的问题。我快速浏览了模型文件的文件格式。第一眼看不出有什么区别。重新创建文件时是否更改了其他内容? @WizardofKneup 我试图准确地重新创建模型文件。我只是在内容上使用 diff 进行了仔细检查。 XML 中的某些属性的顺序不同(使差异更难检查!),但我能看到的唯一明显区别是我无意中将小数更改为双精度,并且在新版本中我标记的更少属性作为可选。没有明显的区别会导致错误。 我也有同样的问题。这肯定是 XCode/CoreData 中的一个错误。您是否向 Apple 报告了此问题? @WizardofKneup 这是一个旧线程,但我遇到了类似的问题,显然 .xcdatamodeld 包中存在 .xccurrentversion 导致了“损坏”。

以上是关于insertNewObjectForEntityForName 找不到实体 (Swift)的主要内容,如果未能解决你的问题,请参考以下文章