我正在努力找出一个体面的解决方案来解决在核心数据中使用嵌套托管对象上下文时出现的问题。以一个有两个实体Person 和Name 的模型为例,其中每个Person 与一个Name 是一对一的关系,而Name 的person 关系不是可选的。以前,在 Person 的-awakeFromInsert
方法中,我会自动为新的 Person 创建一个 Name 实体:
- (void)awakeFromInsert
{
[super awakeFromInsert];
NSManagedObjectContext *context = [self managedObjectContext];
self.name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
}
这在单个非嵌套托管对象上下文中工作得很好。但是,如果上下文有父上下文,则在保存子上下文时,会在父上下文中创建一个新的 Person 对象,并在复制原始 Person 的属性和关系之前-awakeFromInsert
在此新对象上再次调用。因此,创建了另一个 Name 对象,然后在复制现有名称关系时“断开连接”。保存失败,因为对浮动名称的 now-nil关系的验证失败。这个问题在这里和其他地方都有描述。person
到目前为止,我一直无法想出一个好的解决方案来解决这个问题。在 getter 方法中懒惰地创建关系实际上会导致同样的问题,因为当在父上下文中创建新 Person 时,内部 Core Data 机器会调用 getter。
我唯一能想到的就是放弃自动关系生成,并始终在创建 Person 的控制器类或+[Person insertNewPersonInManagedObjectContext:]
仅由我的代码调用的便捷方法(例如)中显式创建关系,并且始终用于显式创建新 Person 对象的方法。也许这是最好的解决方案,但我宁愿不必如此严格地只允许使用一个方法来创建托管对象,而其他我无法控制且我无法使用的创建方法轻松检查/排除,存在。一方面,这将意味着多个 NSArrayController 子类来自定义它们创建托管对象的方式。
遇到此问题的其他人是否提出了一个优雅的解决方案,允许一个 NSManagedObject 在创建/插入时自动创建关系对象?