我应该如何将对象实例导入Core数据?

时间:2012-02-05 18:30:39

标签: objective-c ios core-data initialization

我创建了一个使用CoreLocation和Reverse Geocoding的自定义LocationGenerator类,并生成(当被询问时)自定义Location对象。我的自定义Location对象有两个实例变量 - Address和GPS ...都指向两个自定义类的实例 - Address是一串字符串,GPS是三个浮点数 - 纬度,经度和海拔高度。

位置=地址+ GPS

为了实现这一点,我需要创建三个自定义类 - 位置,地址和GPS,所有这些类都在各自的init方法中设置默认值。

然后我转到核心数据。在模型中,我有这些实体 - 项目,位置,地址和GPS。 Item实体具有一些简单的字符串属性和Location关系。 位置实体具有地址和GPS关系。

自从我转移到Core数据后,我删除了上面提到的自定义类Location Location和GPS,让Xcode根据核心数据模型生成类。

问题是,我不知道如何在LocationGenerator中创建一个Location实例。 我之前对位置和地址以及GPS的类定义已经消失了,在核心数据中我不应该覆盖init方法。但是,那些generatede classess应该是我的新Location对象的蓝图吗?

我想我的问题是,我应该如何在LocationGenerator中生成一个位置对象。 LocationGenerator是否应在托管对象上下文“内部”创建其Location对象? 从UI的角度来澄清 - 我正处于创建Item的过程中,但它尚未创建,它等待Location ..然后才将其插入到核心数据中。 我是否应该像以前查看对象一样查看在上下文中创建的所有对象,唯一的区别是它们在上下文中(并由CD规则管理)并且它们会持续存在?

1 个答案:

答案 0 :(得分:2)

托管对象的指定初始化程序(即核心数据对象)是-initWithEntity:insertIntoManagedObjectContext:,也就是说,如果没有与托管对象关联,则无法创建托管对象。您指示要创建对象,然后在稍后的某个时间决定是否存储它。基本上有两种方法可以做到这一点。第一种方法是使某些其他对象类型不是NSManagedObject,但是当您决定应该持久化时,可以使用它来填充NSManagedObject子类。另一种方法是在上下文中创建托管对象,然后如果事实证明您不需要它,则将其从上下文中删除。

NSManagedObjectContexts可以被认为是“便笺簿”。在您-save:上下文之前,实际上没有任何内容持续存在,因此,如果您将能够确定是否将对象保留在您要保存上下文的同一工作流中,第二种方式可能是要走的路。如果此预先保留数据的生命周期长于您使用ManagedObjectContexts执行的标准工作流,那么第一种方式可能会更好。

HTH。