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

我在Xcode 8 beta 1中遇到了Core Data的困难。旧的应用程序将编译并运行良好,但所有新应用程序编译并运行正常,直到尝试插入新的NSManagedObject。

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

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

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

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

无法将“NSManagedObject_A_”(0x7fd114626f80)类型的值转换为“MyApp.A”(0x10d2fdf28)。

我已经检查了我的xcdatamodel十几次,以确保我拼写正确的一切,并创建了一个新项目进行测试,以确保我没有在设置CD时出现任何错误。 思考?

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

                 

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

我终于想通了:

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

在此处输入图像描述

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

 @objc(Player) class Player: NSManagedObject { } 

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

 let container = NSPersistentContainer(name: "sampleDataModel")