我试图在不创建NSManagedObject的子类的情况下插入CoreData。但是我的应用程序在类别中与NSManagedObject setValue:forUndefinedKey“name”崩溃。
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let entitiyDesc = NSEntityDescription()
entitiyDesc.name = "Category"
guard let data = model.data else { return }
for d in data {
let managedObject = NSManagedObject.init(entity: entitiyDesc, insertIntoManagedObjectContext: managedObjectContext)
managedObject.setValue(d.name, forKey: "name")
}
try! managedObjectContext.save()
子类化NSManagedObjects有什么好处
答案 0 :(得分:14)
使用Core Data的方式没有任何问题。通常,您在以下时间开始想要子类化:
NSManagedObject
NSManagedObject
我确信该列表中还有更多内容。
您永远不会需要来继承NSManagedObject
,但在许多情况下,它确实使您的代码更清晰,更易于维护。
对您的代码提出几点意见:
NSEntityDescription
和NSManagedObject
。您应该使用便捷方法NSEntityDescription.insertNewObjectForEntityForName(_:)
而不是NSManagedObjectContext
访问AppDelegate
就像是一个糟糕的设计(是的,我知道它在Apple模板中)。如Core Data Programming Guide中所讨论的那样使用依赖注入要好得多,并避免访问AppDelegate
所固有的紧密耦合答案 1 :(得分:1)
诚实地对NSManagedObject进行子类化可以让您的开发人员生活更轻松。
setValue:forUndefinedKey
。您应该查看official documentation或this tutorial以开始使用。
答案 2 :(得分:1)
Marcus Zarra的回答是100%正确的,但我想强调的是,考虑到未定义键的风险"和输入错误,以及调试成本,同时在心理上记住哪些实体具有哪些属性键,到子类或不应该是一个选择。
强调您的NSManagedObject
(即通过子类化)也会打开大量的编译时检查和实用程序,尤其是在Swift中。
如果您是Core Data的新手,请允许我向您介绍我编写的库CoreStore,该库是围绕Swift的类型安全设计的:
NSFetchedResultsController
- 与观察者一样您还可以获得强大的功能,例如交易,渐进式迁移等。它就像训练轮上的核心数据一样;如果Core Data中存在不良做法,CoreStore很可能不会让您首先编写该代码。