9

我在 Xcode 8 beta 1 中使用 Core Data 时遇到了困难。旧应用程序可以正常编译和运行,但所有新应用程序都可以正常编译和运行,直到尝试插入新的 NSManagedObject。

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

我试过使用let a = A(context: myMOC)which 返回错误:

类“MyApp.A”的 NSManagedObject 必须具有有效的 NSEntityDescription。

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

无法将“NSManagedObject_A_”(0x7fd114626f80)类型的值转换为“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。

4

3 回答 3

14

我终于想通了:

在 Xcode 7 中,您必须输入类名,在 Swift 中,将模块设置为“当前项目模块”。我认为在 Xcode 8 中不再需要它,因为它会自动生成源文件。您确实必须手动将类名设置为生成类的名称,以使 Xcode 生成@objc(ClassName)(我不知道为什么它需要该注释 - 为 CoreData 实体手动创建的类对我来说没有它)。此外,您不必手动设置模块,否则 Xcode 无法再找到生成的类。

在此处输入图像描述

于 2016-07-11T12:27:53.040 回答
1

我有同样的错误。就我而言,我需要将 Swift 类公开给 ObjectiveC 运行时。为此,请@objc(ModelClass)在 Swift 类声明之前添加,如下所示:

@objc(Player)
class Player: NSManagedObject {
}
于 2017-02-20T18:59:12.400 回答
0

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

let container = NSPersistentContainer(name: "sampleDataModel")
于 2017-03-17T04:53:20.690 回答