【发布时间】:2009-09-28 16:40:12
【问题描述】:
有没有办法在上下文之外初始化托管对象。我基本上是先尝试在上下文之外分配/初始化一个托管对象,然后确定我是否真的要插入该对象,然后使用现有的托管对象上下文将其注入数据存储区。
这可能吗,还是违背了 Core Data 的预期用途?
【问题讨论】:
有没有办法在上下文之外初始化托管对象。我基本上是先尝试在上下文之外分配/初始化一个托管对象,然后确定我是否真的要插入该对象,然后使用现有的托管对象上下文将其注入数据存储区。
这可能吗,还是违背了 Core Data 的预期用途?
【问题讨论】:
托管对象是由上下文“托管”的,因此你不能用 alloc 来实例化它们,因为它们并不是注定的。但是,通过上下文实例化托管对象不会持久化,直到你在上下文上调用 save 方法,因此使用上下文来实例化它会产生相同的效果,并且只有在您确定您确实想要使用该对象后才保存。
【讨论】:
不,您不能在 NSManagedObjectContext 之外实例化 NSManagedObject 实例(当然可以,但是会发生不好的事情,并且您的程序几乎肯定不会像您希望的那样工作)。但是,您可以创建一个 NSInMemoryPersistentStore 支持的 NSManagedObjectContext。它的设置稍微多一点(不多),当您解除内存存储时,一切都消失了。同时,您可以获得 Core Data 对象图管理的所有好处。
【讨论】:
对于偶然发现这个问题的任何人,以下是我如何完成 OP 可能的目标:
NSManagedObjectContext *moc = AppDelegate.managedObjectContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyModel"
inManagedObjectContext:moc];
MyModel *model = [[MyModel alloc] initWithEntity:entity
insertIntoManagedObjectContext:nil];
【讨论】:
awakeFromInsert 没有被调用!
awakeFromInsert 如果您稍后通过[moc insertObject:model];将其添加到 MOC 将被调用
您可能正在拍摄的是多个上下文。您可以创建一个额外的“便签本”上下文,然后将任何更改合并回主上下文。 Apple 的 iPhone 示例项目之一就是完成了这件事。您必须登录开发中心才能找到它。
【讨论】: