如何创建核心数据 NSManagedObject 的独立实例 - 非托管
Posted
技术标签:
【中文标题】如何创建核心数据 NSManagedObject 的独立实例 - 非托管【英文标题】:How to create standalone instance of Core Data NSManagedObject - not managed 【发布时间】:2015-02-16 17:57:26 【问题描述】:如何创建独立 Core Data NSManagedObject
实例 - 了解非托管
我有课
class Location: NSManagedObject
....
let managedLocation = NSEntityDescription.insertNewObjectForEntityForName(
"Location", inManagedObjectContext: managedObjectContext
) as Location
let standaloneLocation = Location() // didn't work
最后一个表达式抛出异常
CoreData:错误:无法调用指定的初始化程序 NSManagedObject 类'AppName.Location'
我明白为什么 - 但是有没有办法创建临时实例,它不会被保存?
【问题讨论】:
Can I make instances of an NSManagedObject in no particular NSManagedObjectContext?的可能重复 【参考方案1】:您可以将nil
作为托管对象上下文传递:
let standaloneLocation = NSEntityDescription.insertNewObjectForEntityForName(
"Location", inManagedObjectContext: nil
) as Location
请注意,这会为您创建一个未插入上下文的实例;你仍然不会写这样的代码:
let standaloneLocation = Location()
【讨论】:
这可能导致未定义的行为。【参考方案2】:满足您的要求的最简单方法是为此对象创建一个新的子上下文。
使用适当的NSManagedObjectContextConcurrencyType
创建一个新的子上下文
设置子的父上下文。
使用子上下文创建新的托管对象实例:
让 managedLocation = NSEntityDescription.insertNewObjectForEntityForName( “位置”,inManagedObjectContext:childContext ) 作为位置
对该对象做任何你想做的事。如果您不想将其合并到父上下文中,只需处置子上下文即可。
Managed object contexts are intended to be "scratchpads"。代表事务或更改集,并且是轻量级的。如果不需要对上下文或其拥有的托管对象进行的更改,请丢弃它们。
重要的是要记住托管对象与托管对象上下文有着非常密切的关系——它是提供大部分功能的上下文。因此,始终使用一个有效的上下文创建托管对象实例很重要——即使它是一个临时的。
【讨论】:
以上是关于如何创建核心数据 NSManagedObject 的独立实例 - 非托管的主要内容,如果未能解决你的问题,请参考以下文章
在 Xcode 6 中从核心数据数据模型创建 NSManagedObject 子类
如何将 NSManagedObject 的 NSKeyedUnarchive 子类导入核心数据?
如何将 NSObject 模型类转换为 NSManagedObject 的子类?