【问题标题】:Can I create manually an instance of an Core Data Entity class for temporary usage?我可以手动创建 Core Data Entity 类的实例以供临时使用吗?
【发布时间】:2011-01-16 02:35:14
【问题描述】:

我有一个用于核心数据实体的自定义类,称为“朋友”。在解析 XML 文件时,我需要创建临时实例来保存临时数据,此时不使用 Core Data。所以有两种选择:

A) 创建一个 NSMutableDictionary 来保存临时数据,同时从 XML 中解析一个“对象”。

B) 在解析时使用实体的类来存储临时数据。我更喜欢这样,因为它对我来说更清晰、更干燥,因为数据结构已经在那里声明了,我不必在 NSMutableDictionary 中复制该实体的整个数据模型。

但是 B 有一个问题:默认情况下,所有属性都是@dynamic,据我所知,Core Data 负责在运行时创建实现。所以我不能只使用那里的属性。因此,这提出了一个问题,是否值得付出努力,甚至可以修改该类,使其可以在没有 Core Data 的情况下用作临时数据容器对象,即通过创建实例变量。当然,如果我必须在其中创建一个字典来保存临时数据,那根本没有意义,我只会选择 A。

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    更新:听起来您可以使用 nil 上下文(请参阅下面 Adam 的回答)

    不幸的是,实例化托管对象子类的唯一方法是将其插入上下文中。

    使用可变字典 (NSMutableDictionary) 是最好的方法,因为您可以使用 setValuesForKeysWithDictionary: 通过单个方法调用填充新的托管对象。

    另一种方法是插入托管对象,如果您确定它不是新的,则将其删除。如果您尚未保存,则该对象将永远不会被写入持久存储。
    注意:这假设您在添加其唯一 ID 之前确定对象是否是新的,或者在获取唯一 ID 时排除临时对象(带有属性或使用它们的集合过滤掉),以便您只检查以前存在的对象。

    【讨论】:

    • 最后一种方法是我首先采用的方法。但是我不确定 Core Data 是否也会查询上下文中但尚未保存的对象。就像...想象一下,我在上下文中有 100 个尚未保存的临时对象,并且我对托管对象上下文进行了查询。此查询是否还会从上下文中检索未保存的对象?
    • 理想的情况是将数据存储在NSDictionary 中,该NSDictionary 具有完全反映您的NSManagedObject 的键。然后,如果您决定需要存储它,请创建一个 NSManagedObject 并调用 -setValuesForKeysWithDictionary: 以在单个方法调用中填充该对象。
    • @Adam 是正确的。您可以使用 nil 上下文。看到这个问题:stackoverflow.com/questions/3256195/…
    【解决方案2】:

    不同意 gerry3,Apple 的文档暗示相反。您只需使用 nil 上下文调用指定的初始化程序:

    - (id)initWithEntity:(NSEntityDescription *)实体insertIntoManagedObjectContext:(NSManagedObjectContext *)上下文

    ... 如果上下文不为零,则此方法 调用 [上下文 insertObject:self] (这导致 awakeFromInsert 是 调用)。

    这似乎有效(我目前正在使用临时 NSManagedObjects - 尽管我可能做错了)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      相关资源
      最近更新 更多