如何在核心数据上下文之外使用核心数据模型子类?
How to use Core Data model subclasses outside a Core Data context?
我正在尝试在 Swift 中制作一个天气应用程序,它将保存我添加到 Core Data 中的城市,每个城市都包含一个天气对象,该对象也保存到 Core Data 和其他各种变量中。
但我很快发现,在 Core Data 上下文之外使用 Core Data NSManagedObjects subclasses 几乎是不可能的(处理 NSNumber 和类似的东西,没有自定义初始化,被迫将它们保存在某个地方,如果我明天停止使用 Core Data,...)。
那么在继续使用 Core Data 的同时也在其上下文之外使用模型的最佳实践是什么?
我现在的解决方案是为每个模型创建一个 Class,所以 :
class City
{
var country: String?
var name: String?
// ...
}
是:
对应的class
class CD_City
{
@NSManaged var country: String?
@NSManaged var name: String?
// ...
}
所以我可以随时随地使用 City
。但是我需要一个函数来将 City
变成 CD_City
并且相反。所以我真的不确定我是否以最好的方式做到了。
另外你会推荐什么作为转换方法?
(仅供参考,我使用 MagicalRecord 作为核心数据助手)
TL;DR - 不要那样做,否则会损坏。
过去曾有各种技巧可以让它正常工作,但它们都依赖于 CoreData 中未记录的行为。我 永远不会 在我想展示给另一个人的代码中使用任何类似的东西,更不用说运送给客户了。 CoreData 需要插入 proxy objects that hook into property change events on your model objects, and the only way it can reliably do that and track the original data values were is if it is responsible for creating those entities in the first place; That also makes the faulting & uniquing system work. Don't think of Core Data as an ORM, it really is an object graph management framework,因此它被设计为以某种方式使用,没有简单的解决方案来避开它 安全地。
如果您不想保存 NSManagedObject 或其子类,则可以使用
创建它
init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?)
并为 insertIntoManagedObjectContext
传递 nil
这将为您创建一个实例,但不会保存到 MOC。
如果你以后必须将它保存到 MOC,你可以使用 NSMangedObjectContext 的
func insertObject(_ object: NSManagedObject)
我正在尝试在 Swift 中制作一个天气应用程序,它将保存我添加到 Core Data 中的城市,每个城市都包含一个天气对象,该对象也保存到 Core Data 和其他各种变量中。
但我很快发现,在 Core Data 上下文之外使用 Core Data NSManagedObjects subclasses 几乎是不可能的(处理 NSNumber 和类似的东西,没有自定义初始化,被迫将它们保存在某个地方,如果我明天停止使用 Core Data,...)。
那么在继续使用 Core Data 的同时也在其上下文之外使用模型的最佳实践是什么?
我现在的解决方案是为每个模型创建一个 Class,所以 :
class City
{
var country: String?
var name: String?
// ...
}
是:
对应的classclass CD_City
{
@NSManaged var country: String?
@NSManaged var name: String?
// ...
}
所以我可以随时随地使用 City
。但是我需要一个函数来将 City
变成 CD_City
并且相反。所以我真的不确定我是否以最好的方式做到了。
另外你会推荐什么作为转换方法?
(仅供参考,我使用 MagicalRecord 作为核心数据助手)
TL;DR - 不要那样做,否则会损坏。
过去曾有各种技巧可以让它正常工作,但它们都依赖于 CoreData 中未记录的行为。我 永远不会 在我想展示给另一个人的代码中使用任何类似的东西,更不用说运送给客户了。 CoreData 需要插入 proxy objects that hook into property change events on your model objects, and the only way it can reliably do that and track the original data values were is if it is responsible for creating those entities in the first place; That also makes the faulting & uniquing system work. Don't think of Core Data as an ORM, it really is an object graph management framework,因此它被设计为以某种方式使用,没有简单的解决方案来避开它 安全地。
如果您不想保存 NSManagedObject 或其子类,则可以使用
创建它init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?)
并为 insertIntoManagedObjectContext
传递 nil
这将为您创建一个实例,但不会保存到 MOC。
如果你以后必须将它保存到 MOC,你可以使用 NSMangedObjectContext 的
func insertObject(_ object: NSManagedObject)