【问题标题】:How to create standalone instance of Core Data NSManagedObject - not managed如何创建核心数据 NSManagedObject 的独立实例 - 非托管
【发布时间】: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'

我明白为什么 - 但是有没有办法创建临时实例,它不会被保存?

【问题讨论】:

标签: ios swift core-data


【解决方案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"。代表事务或更改集,并且是轻量级的。如果不需要对上下文或其拥有的托管对象进行的更改,请丢弃它们。

重要的是要记住托管对象与托管对象上下文有着非常密切的关系——它是提供大部分功能的上下文。因此,始终使用一个有效的上下文创建托管对象实例很重要——即使它是一个临时的。

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2015-01-22
    相关资源
    最近更新 更多