如何创建核心数据 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 保存在核心数据中但属性错误

如何将 NSManagedObject 的 NSKeyedUnarchive 子类导入核心数据?

如何将 NSObject 模型类转换为 NSManagedObject 的子类?

核心数据。如何使用在 NSManagedObject 子类中创建的方法

核心数据 NSManagedObject 到 JSON 编码不起作用