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

Posted

技术标签:

【中文标题】核心数据模型似乎没有反映在应用程序中【英文标题】:Core Data Model doesn't appear to be reflected in app 【发布时间】:2016-06-22 04:53:38 【问题描述】:

我在使用 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 会返回错误:

无法转换“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"  />
        <element name="Coordinate" positionX="-18" positionY="27"  />
    </elements>
</model>

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

【问题讨论】:

如果自定义类名称/模块未在数据模型中正确填写,您列出的第二个错误是我所期望的。你确认它们是正确的吗? 我已经验证过多次。我已经测试了我拥有的每个实体并得到了相同的错误。 请将您的数据模型的 XML 内容添加到您的 Q 中。您可以在 xcdatamodel 包中找到它。或者添加模型编辑器的屏幕截图。 嗨。您是否看到之前发布的类似问题?它可能会帮助你。 ***.com/questions/37956720/… 我在 Xcode 8 beta 1 和 beta 2 中都有同样的问题。似乎与生成的类有关。 【参考方案1】:

我终于明白了:

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

【讨论】:

谢谢!我要离开几天。我回家后会测试一下并接受您的回答。 我遇到了同样的问题*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An NSManagedObject of class 'MyAp.MyClass' must have a valid NSEntityDescription.' 我不得不将@objc(MyClass) 添加到我的管理对象类的顶部。 与 masters3d 一样对我有用。在编写 class MyClass: NSManagedObject // ... 之前,您将 @objc(MyClass) 放在了行上,问题就消失了 嘿,我在某处了解到,除非您使用不同的模块,否则假设在工作区中您不需要将模块的名称更改为“当前产品模块”(您可以让它成为全球的...)。我遇到了与问题中提到的相同的问题,但是一旦我将模块更改为“当前...”,它就开始正常工作。我想知道为什么会这样,知道吗?【参考方案2】:

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

@objc(Player)
class Player: NSManagedObject 

【讨论】:

【参考方案3】:

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

let container = NSPersistentContainer(name: "sampleDataModel")

【讨论】:

以上是关于核心数据模型似乎没有反映在应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

核心数据在 App 重启之前不会改变

应用程序中的核心数据信息

是否可以在一个应用程序中使用多个 Core Data 模型?

Vue 数据模型更改未反映在绑定组件中

我的核心数据数据模型中的一个实体没有被删除

er模型是反映数据库应用系统的啥模型