'className'的NSManagedObject必须具有有效的NSEntityDescription。错误

问题描述 投票:15回答:11

我在CDModel.xcdatamodeld中创建了一个简单的实体'CDWorkout',其中一个属性'name'。 AppDelegate中的容器名称也是“CDModel”。 “CDWorkout”的类Codegen是类别/扩展名。这是CDWorkout类的代码:

class CDWorkout: NSManagedObject {

    class func createWorkout(workoutInfo : Workout, in context: NSManagedObjectContext) -> CDWorkout{
        let workout = CDWorkout(context: context)
        workout.name = "anyName"
        return workout
    }
}

createWorkout函数从另一个viewController调用,上下文参数为container.viewContext,但它会立即崩溃并显示消息:

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'类'Workout_Generator.CDWorkout'的NSManagedObject必须具有有效的NSEntityDescription。

我忘记了什么?

swift core-data
11个回答
16
投票

问题是我没有检查类模块:CDWorkout Entity的当前产品模块。


0
投票

很容易回答这个问题。没有删除

entityClassName

解决方案是关于“实体名称和类名”的纪录片extension NSManagedObject { public static var entityName: String { let className = NSStringFromClass(self) // As alternative can be used `self.description()` or `String(describing: self)` let entityName = className.components(separatedBy: ".").last! return entityName } public static var entityClassName: String { let className = NSStringFromClass(self) return className } } 。在你的Xcode之前(编辑器 - >创建NSManagedObject SubClass)必须更改你的类实体名称以添加“MO”,CoreData可以区分类名和实体名。和

@objc(Workout)

不会被创建,给我们这个:

Core Data Programming

@objc(Workout)


0
投票

我犯的错误是更改实体的名称和生成的“NSManagedObject子类”,而不是更新类的名称。怎么修:

  • 打开.xcdatamodeld
  • 单击实体
  • 打开右边的面板
  • 转到数据模型检查器
  • 更改“类”文本字段的名称

8
投票

在我的情况下,同样的问题是在自动生成的数据类头中的@objc修饰符

@objc(CachedMovie)
public class CachedMovie: NSManagedObject {

我刚刚删除了@objc(CachedMovie),它开始工作了


6
投票

我有一个愚蠢的小问题,导致同样的错误。我用不正确的名称初始化NSPersistentContainer。

它应与源文件具有相同的名称,扩展名为.xcdatamodeld。例如modelFileName.xcdatamodelId

let persistentContainer = NSPersistentContainer(name: "modelFileName")

4
投票

尝试从扩展(SiriKit)插入/添加托管对象时,我遇到了同样的错误消息。这似乎是扩展名称空间与.xcdatamodeld文件不匹配的问题,因为我使用MyClass.entity()创建实体描述。

对我有用的组合是:

  • @objc(MyClass)位于每个NSManagedObject子类的顶部
  • 数据模型中的实体使用默认的“全局命名空间”,而不是“当前产品模块”
  • 使用let entity = NSEntityDescription.entity(forEntityName: "MyClass", in: context)!创建实体描述

1
投票

enter image description herein你的文件modeldataClass可能名称是不正确的原因之前你更改名称类中的名称


1
投票

如果您使用静态库中的核心数据,请确保同时指定模块

enter image description here

这为您提供了正确的实体访问MyStaticLibrary.MyManagedObject

因此,如果您收到带有此点符号的警告,则不会查看您的模块


0
投票

您需要先创建新的NSManagedObject才能使用它

let workout = NSEntityDescription.insertNewObjectForEntityForName("CDWorkout",
    inManagedObjectContext: context) as! CDWorkout

现在你可以像你一样设置名称:workout.name = "any_name"

有关CoreData的更多信息,请参阅CoreData Documentation


0
投票

我在使用qazxsw poi代码制作的qazxsw poi的Core Data堆栈中遇到了类似的问题。问题是NSManagedObjectModel属性的错误值。错过了Swift前缀。

正确设置:

NSEntityDescription.managedObjectClassName

其中:Swift modulelet entity = NSEntityDescription() entity.name = PostEntity.entityName // `PostEntity` entity.managedObjectClassName = PostEntity.entityClassName // `MyFrameworkName.PostEntity` entity.properties = [....] 定义如下。

entityName

0
投票

我正在尝试将CoreData添加到现有项目中,并且我重命名了很多东西。我最终得到了多个.xcdatamodeld而不知道它。解决方案是删除.xcdatamodeld并生成NSManagerObject并再次重新创建它。

© www.soinside.com 2019 - 2024. All rights reserved.