我在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。
我忘记了什么?
问题是我没有检查类模块:CDWorkout Entity的当前产品模块。
很容易回答这个问题。没有删除
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)
我犯的错误是更改实体的名称和生成的“NSManagedObject子类”,而不是更新类的名称。怎么修:
在我的情况下,同样的问题是在自动生成的数据类头中的@objc修饰符
@objc(CachedMovie)
public class CachedMovie: NSManagedObject {
我刚刚删除了@objc(CachedMovie)
,它开始工作了
我有一个愚蠢的小问题,导致同样的错误。我用不正确的名称初始化NSPersistentContainer。
它应与源文件具有相同的名称,扩展名为.xcdatamodeld。例如modelFileName.xcdatamodelId
let persistentContainer = NSPersistentContainer(name: "modelFileName")
尝试从扩展(SiriKit)插入/添加托管对象时,我遇到了同样的错误消息。这似乎是扩展名称空间与.xcdatamodeld
文件不匹配的问题,因为我使用MyClass.entity()
创建实体描述。
对我有用的组合是:
@objc(MyClass)
位于每个NSManagedObject
子类的顶部let entity = NSEntityDescription.entity(forEntityName: "MyClass", in: context)!
创建实体描述您需要先创建新的NSManagedObject
才能使用它
let workout = NSEntityDescription.insertNewObjectForEntityForName("CDWorkout",
inManagedObjectContext: context) as! CDWorkout
现在你可以像你一样设置名称:workout.name = "any_name"
有关CoreData的更多信息,请参阅CoreData Documentation
我在使用qazxsw poi代码制作的qazxsw poi的Core Data堆栈中遇到了类似的问题。问题是NSManagedObjectModel
属性的错误值。错过了Swift
前缀。
正确设置:
NSEntityDescription.managedObjectClassName
其中:Swift module
和let entity = NSEntityDescription()
entity.name = PostEntity.entityName // `PostEntity`
entity.managedObjectClassName = PostEntity.entityClassName // `MyFrameworkName.PostEntity`
entity.properties = [....]
定义如下。
entityName
我正在尝试将CoreData添加到现有项目中,并且我重命名了很多东西。我最终得到了多个.xcdatamodeld而不知道它。解决方案是删除.xcdatamodeld并生成NSManagerObject并再次重新创建它。