【问题标题】:NSEntityDescription.insertNewObjectForEntityForName cannot be typecast to NSManagedObject subclassNSEntityDescription.insertNewObjectForEntityForName 不能被类型转换为 NSManagedObject 子类
【发布时间】:2016-04-07 11:30:40
【问题描述】:

我的核心数据堆栈中有一个简单的实体(称为日记)。该实体有一个属性(名称)

我使用编辑器生成了 NSManagedObject 子类。我还确保类名遵循 appName.DiaryEntry 格式

xcode 7 删除了“.”并给我一个名称为:appNameDiaryEntry

这是我正在使用的代码

let diaryEntry : DiaryDiaryEntry

diaryEntry = NSEntityDescription.insertNewObjectForEntityForName("DiaryDiaryEntry", inManagedObjectContext: dataStoreController.managedObjectContext!) as DiaryDiaryEntry

在上面的代码中,DiaryDiaryEntry 是从 coredata 模型创建的 NSManagedObject 子类。

我收到一个错误提示

“NSManagedObject”不能转换为“DiaryDiaryEntry”

如果我使用 as! 强制进行向下转换,它可以工作,但在运行时出现错误(因为该值为 nil 并且被强制解包?)

任何想法如何解决这个问题?谢谢,Karthik

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    首先,由于insert.. 返回AnyObject,您需要对其进行转换。 as! 运行时崩溃的风险最高,有几种方法可以做到这一点。

    您也可以将其设置为警卫,例如:

    let entity = NSEntityDescription.insertNewObjectForEntityForName("DiaryDiaryEntry", inManagedObjectContext: dataStoreController.managedObjectContext!) as? DiaryDiaryEntry else { fatalError("Failed to load subclass") }
    

    这仍然会给你一个运行时错误,但它允许你控制事件。

    至于返回nil,这表明您在模型或该代码行中的实体名称中有一个类型。这行代码应该从不返回nil。我怀疑您的实际实体名称是DiaryEntry

    正如 Mundi 所指出的,您的班级名称有点重复。虽然他喜欢保持类名和模型名相同,但我更喜欢给我的类名添加后缀,这将使你的类名成为DiaryEntryMO,我发现在维护代码时很容易使用。

    【讨论】:

      【解决方案2】:

      对于您的情况,我建议使用 same 实体名称和类名称。 (更多详细信息here。)因此,您应该消除(笨拙的)“DiaryDiaryEntry”,并将其替换为“DiaryEntry”。

      【讨论】:

      • 感谢您的帮助。我更改了类名以匹配实体名(以前它不起作用,因为 xcode 抱怨它找不到类,但我认为我在创建 NSManaged 子类时没有明确指定类名)......我仍然得到 nil 异常,这是因为 managedObject 上下文为零。控制器的 storeURL(指向 MySql.sqlite)在该位置没有显示任何具有该名称(即 MySql.sqlite)的内容...?
      【解决方案3】:

      您当然必须对as! 感到沮丧,但是当NSEntityDescription.insertNewObjectForEntityForName(...) 返回nil 时,显然还有其他问题。您应该检查您的实体名称是否正确(必须与为数据模型中的实体指定的名称相同)。在打开数据模型并选择所需实体时,您可能需要查看数据模型检查器:您必须在 Class 下指定类的名称,然后在 Module 下选择 Current Project Module

      【讨论】:

      • 感谢 Oliver 和 Marcus 的投入。由于某种原因,我的 managedObject Context 似乎为零。请看我上面的评论...有什么想法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多