【问题标题】:iPhone Core Data: Initializing Managed Object without a contextiPhone核心数据:在没有上下文的情况下初始化托管对象
【发布时间】:2009-09-28 16:40:12
【问题描述】:

有没有办法在上下文之外初始化托管对象。我基本上是先尝试在上下文之外分配/初始化一个托管对象,然后确定我是否真的要插入该对象,然后使用现有的托管对象上下文将其注入数据存储区。

这可能吗,还是违背了 Core Data 的预期用途?

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    托管对象是由上下文“托管”的,因此你不能用 alloc 来实例化它们,因为它们并不是注定的。但是,通过上下文实例化托管对象不会持久化,直到你在上下文上调用 save 方法,因此使用上下文来实例化它会产生相同的效果,并且只有在您确定您确实想要使用该对象后才保存。

    【讨论】:

    • 我想了很多,只是想确认是这样的。谢谢丹尼尔。
    【解决方案2】:

    不,您不能在 NSManagedObjectContext 之外实例化 NSManagedObject 实例(当然可以,但是会发生不好的事情,并且您的程序几乎肯定不会像您希望的那样工作)。但是,您可以创建一个 NSInMemoryPersistentStore 支持的 NSManagedObjectContext。它的设置稍微多一点(不多),当您解除内存存储时,一切都消失了。同时,您可以获得 Core Data 对象图管理的所有好处。

    【讨论】:

      【解决方案3】:

      对于偶然发现这个问题的任何人,以下是我如何完成 OP 可能的目标:

      NSManagedObjectContext *moc = AppDelegate.managedObjectContext;
      NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyModel"
          inManagedObjectContext:moc];
      MyModel *model = [[MyModel alloc] initWithEntity:entity
          insertIntoManagedObjectContext:nil];
      

      【讨论】:

      • 如果 MOC 是使用默认的 NSConfinementConcurrencyType 以外的任何东西创建的,我会谨慎使用它 -- NSPrivateQueueConcurrencyType 或 NSMainQueueConcurrencyType 可能会导致属性被 nil'ed 的问题
      • 另外,awakeFromInsert 没有被调用!
      • awakeFromInsert 如果您稍后通过[moc insertObject:model];将其添加到 MOC 将被调用
      • 不确定你提到的并发设置,好点
      • 我不能确定我的属性是什么。也可能是 [super awakeFromInsert] 正在做的事情......然而,关键是这个方法有一些陷阱,即使它似乎在单一上下文中对我有用。
      【解决方案4】:

      您可能正在拍摄的是多个上下文。您可以创建一个额外的“便签本”上下文,然后将任何更改合并回主上下文。 Apple 的 iPhone 示例项目之一就是完成了这件事。您必须登录开发中心才能找到它。

      【讨论】:

        猜你喜欢
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多