核心数据模型似乎没有反映在应用程序中

Core Data Model doesn't appear to be reflected in app

我在使用 Xcode 8 beta 1 中的核心数据时遇到困难。旧应用程序可以编译并且 运行 正常,但是所有新应用程序都可以编译并且 运行 正常,直到尝试插入一个新的 NSManagedObject。

最初我认为它与错误地删除旧的 xcdatamodel 并重新制作另一个有关,但是在制作了一个全新的应用程序并制作了一个简单的实体 "A" 之后,我无法创建一个对象class A 在 运行 时间。

我试过使用 let a = A(context: myMOC) 其中 returns 错误:

An NSManagedObject of class 'MyApp.A' must have a valid NSEntityDescription.

尝试旧的 let a = NSEntityDescription.insertNewObject(forEntityName: "A", into: context) as! A returns 错误:

Could not cast value of type 'NSManagedObject_A_' (0x7fd114626f80) to 'MyApp.A' (0x10d2fdf28).

我检查了我的 xcdatamodel 十几次以确保我拼写正确,并创建了一个新项目来测试以确保我在设置 CD 时没有出错。想法?

更新: xcdatamodel 包内容是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="11147.23" systemVersion="16A201w" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
    <entity name="Coordinate" syncable="YES" codeGenerationType="class">
        <attribute name="latitude" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES" syncable="YES"/>
        <attribute name="longitude" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES" syncable="YES"/>
        <relationship name="route" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Route" inverseName="coordinates" inverseEntity="Route" syncable="YES"/>
    </entity>
    <entity name="Route" syncable="YES" codeGenerationType="class">
        <attribute name="uuid" optional="YES" attributeType="String" syncable="YES"/>
        <relationship name="coordinates" optional="YES" toMany="YES" deletionRule="Nullify" ordered="YES" destinationEntity="Coordinate" inverseName="route" inverseEntity="Coordinate" syncable="YES"/>
    </entity>
    <elements>
        <element name="Route" positionX="-45" positionY="0" width="128" height="75"/>
        <element name="Coordinate" positionX="-18" positionY="27" width="128" height="90"/>
    </elements>
</model>

更新 2: 打印 managedObjectModel 的实体,表明正在加载正确的模型。我仍然无法在任何新项目中初始化 NSManagedObject。

我终于想通了:

在 Xcode 7 中,您必须输入 class 名称,并在 Swift 中将模块设置为 "Current Project Module"。我假设在 Xcode 8 中不再需要它,因为它会自动生成源文件。您必须手动将 class 名称设置为生成的 class 的名称,以使 Xcode 生成 @objc(ClassName)(我不知道为什么它需要该注释- 为 CoreData 实体手动创建的 classes 对我来说没有它就可以工作)。此外,您不必手动设置模块,否则 Xcode 将无法再找到生成的 class。

我遇到了同样的错误。在我的例子中,我需要将 Swift class 暴露给 ObjectiveC 运行时。为此,在 Swift class 声明之前添加 @objc(ModelClass),如下所示:

@objc(Player)
class Player: NSManagedObject {
}

在 AppDelegate 中更正 NSPersistentContainer 名称对我有用。

let container = NSPersistentContainer(name: "sampleDataModel")