gpt4 book ai didi

ios - 使用嵌套上下文时如何自动设置核心数据关系

转载 作者:技术小花猫 更新时间:2023-10-29 11:07:39 27 4
gpt4 key购买 nike

我正在努力寻找一个合适的解决方案来解决在 Core Data 中使用嵌套托管对象上下文时出现的问题。以一个有两个实体的模型为例,Person 和 Name,其中每个 Person 与 Name 具有一对一的关系,而 Name 的人际关系不是可选的。以前,在 Person 的 -awakeFromInsert 中方法,我会自动为新的 Person 创建一个 Name 实体:

- (void)awakeFromInsert
{
[super awakeFromInsert];

NSManagedObjectContext *context = [self managedObjectContext];
self.name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
}

这在单个、非嵌套的托管对象上下文中工作得很好。但是,如果上下文有父上下文,则在保存子上下文时,会在父上下文中创建一个新的 Person 对象,并且 -awakeFromInsert在复制原始 Person 的属性和关系之前再次调用此新对象。因此,创建了另一个 Name 对象,然后在复制现有名称关系时“断开连接”。保存失败,因为 float 名称的验证现在为零 person关系失败。这个问题描述了here以及其他地方。

到目前为止,我一直无法想出一个好的解决方案来解决这个问题。在 getter 方法中懒惰地创建关系实际上会导致同样的问题,因为当在父上下文中创建新的 Person 时,内部 Core Data 机制会调用 getter。

我唯一能想到的就是放弃自动关系生成,并始终在创建 Person 的 Controller 类中或在仅由调用的便捷方法(例如 +[Person insertNewPersonInManagedObjectContext:])中显式创建关系我的代码,总是用于显式创建新 Person 对象的方法。也许这是最好的解决方案,但我宁愿不必如此严格地只允许使用一个方法来创建托管对象,而其他创建方法我无法控制并且我不能使用它们轻松检查/排除,存在。一方面,这意味着多个 NSArrayController 子类可以自定义它们创建托管对象的方式。

有没有其他遇到过这个问题的人想出了一个优雅的解决方案,允许一个 NSManagedObject 在创建/插入时自动创建一个关系对象?

最佳答案

首先想到的是,虽然 Nameperson 关系是非可选的,但您并没有说 Personname 关系也是非可选的。创建一个没有 NamePerson 是否可以,处理您的代码,然后在您实际需要时创建 Name

如果不是,一种简单的方法是在创建 Name 之前检查您是否在根上下文中:

- (void)awakeFromInsert
{
[super awakeFromInsert];

NSManagedObjectContext *context = [self managedObjectContext];
if ([context parentContext] != nil) {
self.name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
}
}

但这只有在您总是在子上下文中创建新实例并且您从不嵌套上下文超过一层时才有效。

我可能会做的是创建一个类似于您描述的 insertNewPersonInManagedObjectContext: 的方法。然后用类似下面的内容对其进行补充,以处理为您创建实例(即数组 Controller )的任何情况:

- (void)willSave
{
if ([self name] == nil) {
NSManagedObjectContext *context = [self managedObjectContext];
Name *name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
[self setName:name];
}
}

...当然不要为自定义awakeFromInsert而烦恼...

关于ios - 使用嵌套上下文时如何自动设置核心数据关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15353728/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com